Python 管道通訊

2022-09-13 21:12:19 字數 3169 閱讀 6019

管道:雙向通訊 2個程序之間相互通訊

1

from multiprocessing import

pipe,process23

deffunc(conn1,conn2):

4conn2.close()

5while

true:

6try

:7 msg =conn1.recv()

8print

(msg)

9except eoferror: #

丟擲無資料時異常

10conn1.close()

11break

1213

if__name__ == '

__main__':

14 conn1, conn2 =pipe()

15 process(target=func,args =(conn1,conn2)).start()

16conn1.close()

17for i in range(20):

18 conn2.send('

吃了麼'

)19 conn2.close()

例項利用管道解決消費者模式

1

from multiprocessing import

lock,pipe,process

2def

producer(con,pro,name,food):

3con.close()

4for i in range(100):

5 f = '

%s生產%s%s

'%(name,food,i)

6print

(f)7

pro.send(f)

8pro.send(none)

9pro.send(none)

10pro.send(none)

11pro.close()

1213

defconsumer(con,pro,name,lock):

14pro.close()

15while

true:

16lock.acquire()

17 food =con.recv()

18lock.release()

19if food is

none:

20con.close()

21break

22print('

%s吃了%s

' %(name, food))

23if

__name__ == '

__main__':

24 con,pro =pipe()

25 lock=lock()

26 p = process(target=producer,args=(con,pro,'

egon

','泔水'))

27 c1 = process(target=consumer, args=(con, pro, '

alex

',lock))

28 c2 = process(target=consumer, args=(con, pro, '

bossjin

',lock))

29 c3 = process(target=consumer, args=(con, pro, '

wusir

',lock))

30c1.start()

31c2.start()

32c3.start()

33p.start()

34con.close()

35pro.close()

3637

from multiprocessing import

process,pipe,lock

3839

defconsumer(produce, consume,name,lock):

40produce.close()

41while

true:

42lock.acquire()

43 baozi=consume.recv()

44lock.release()

45if

baozi:

46print('

%s 收到包子:%s

' %(name,baozi))

47else:48

consume.close()

49break50#

51def

producer(produce, consume,n):

52consume.close()

53for i in

range(n):

54produce.send(i)

55produce.send(none)

56produce.send(none)

57produce.close()58#

59if

__name__ == '

__main__':

60 produce,consume=pipe()

61 lock =lock()

62 c1=process(target=consumer,args=(produce,consume,'c1'

,lock))

63 c2=process(target=consumer,args=(produce,consume,'c2'

,lock))

64 p1=process(target=producer,args=(produce,consume,30))

65c1.start()

66c2.start()

67p1.start()

68produce.close()

69consume.close()

7071

#pipe 資料不安全性72#

ipc73

#加鎖來控制操作管道的行為 來避免程序之間爭搶資料造成的資料不安全現象

7475

#佇列 程序之間資料安全的76#

管道 + 鎖

例子

Linux 管道通訊

一 定義 管道是單向的 先進先出的。它將乙個程式的輸入和另乙個程式的輸出連線起來。資料被乙個程序讀出後,將被從管道中刪除。分為無名和有名管道兩種。前者用於父程序和子程序間的通訊,後者用於同一系統的兩個程序間通訊。二 無名管道 int pipe int fd 2 其中,fd 0 用於讀管道,fd 1 ...

Linux管道通訊

現在在linux 中使用較多的程序間通訊方式主要有以下幾種。1 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊...

pipe管道通訊

pipe函式是用來建立管道的,當它建立成功會返回兩個檔案描述符,0是讀,1是寫 在用管道時,當我們使用讀端就要關閉寫,使用寫端就要關閉讀的功能。include include include include int main double shou 2 int i 0 int ret double ...