python 併發程式設計 管道

2022-05-11 15:21:32 字數 3334 閱讀 4421

1.管道

from multiprocessing import

pipe

conn1,conn2 = pipe() #

返回兩個值

conn1.send('

wdc') #

傳送print(conn2.recv()) #

接收conn2.send('

yhf'

)print(conn1.recv())

結果:

~雙向通訊

2.在程序中傳遞資料

from multiprocessing import

pipe,process

class

pr1(process):

def__init__

(self,conn1):

super().

__init__

() self.conn1 =conn1

defrun(self):

self.conn1.send(

'吃了嗎?')

if__name__ == '

__main__':

conn1,conn2 =pipe()

p =pr1(conn1)

p.start()

print(conn2.recv())

結果:

解決當管道內資料為空時,還在繼續獲取資料時造成的阻塞問題。

from multiprocessing import

pipe,process

class

pr1(process):

def__init__

(self,conn1,conn2):

super().

__init__

() self.conn1 =conn1

self.conn2 =conn2

defrun(self):

self.conn2.close()

#關閉conn2

while

true:

try:

print

(self.conn1.recv())

except eoferror: #

當其他所有的conn埠都被關閉,只剩下乙個conn埠還在獲取管道內的資料,而管道內已經空了的時候就會報eoferror錯誤。

self.conn1.close() #

關閉conn1

break

if__name__ == '

__main__':

conn1,conn2 =pipe()

p =pr1(conn1,conn2)

p.start()

conn1.close()

#關閉conn1

for i in range(10):

conn2.send(

'吃了嗎?')

conn2.close()

#關閉conn2

結果:

輸出10次資料,然後結束全部程序。

管道實現生產者消費者問題:

from multiprocessing import

pipe,process

import

time

import

random

class producer(process): #

生產者類

def__init__

(self,pro,con,name,food):

super().

__init__

() self.pro =pro

self.con =con

self.name =name

self.food =food

defrun(self):

self.con.close()

for i in range(4):

time.sleep(random.randint(1,3))

f = '

{}生產了第{}個{}

'.format(self.name,i,self.food)

print

(f) self.pro.send(f)

self.pro.close()

class

consumer(process):

def__init__

(self,pro,con,name):

super().

__init__

() self.pro =pro

self.con =con

self.name =name

defrun(self):

self.pro.close()

while

true:

try:

f =self.con.recv()

print('

{}吃了{}

'.format(self.name,f))

time.sleep(random.randint(1,3))

except

eoferror:

self.con.close()

break

if__name__ == '

__main__':

con,pro =pipe()

p1 = producer(pro,con,'

wdc','包子'

) p1.start()

c1 = consumer(pro,con,'

yhf'

) c1.start()

con.close()

pro.close()

結果:

如果同時有兩個消費者同時拿到管道中相同的資料,則會報錯,管道中的資料是不安全的。

可以以用加鎖來避免程序直接爭搶資料造成的資料不安全現象。但是佇列是安全的,佇列就是基於管道+鎖

Python併發程式設計 管道

from multiprocessing import pipe,process def func conn1,conn2 conn2.close 子程序只需使用connection1,故關閉connection2 while true try msg conn1.recv print msg ex...

Python 併發程式設計

1.程序 執行緒 協程基本概念,建立 使用 2.協程的應用 生成器 第三方模組 3.併發的實踐 程式執行起來之後建立的乙個程序。建立程序已經學過使用multiprocessing.process類建立 1 multiprocessing.process 指定target引數,建立物件 2 繼承mul...

python併發程式設計 程序,併發

1.程序是乙個正在執行的程式,或者說是程式執行的過程,程序是個抽象概念 程序起源於作業系統,是作業系統最核心的概念,作業系統所有其他的概念都是圍繞程序展開 研究程序最底層就是在研究作業系統底層 2.序列 程序 乙個任務完完整整的執行完畢後,在執行下乙個任務 3.併發 程序 看起來多個任務是同時執行即...