Python並發編程-管道


管道的作用- 兩個進程間傳遞消息

from multiprocessing import Pipe, Process

def func(conn1,conn2):
    conn2.close() #子進程只需使用connection1,故關閉connection2
    while True:
        try:
            msg = conn1.recv()
            print(msg)
        except EOFError:  #沒收數據接收的時候,才拋出的異常
            conn1.close()
            break

if __name__ == '__main__':
    conn1,conn2 = Pipe()#建立一個管道,管道返回兩個connection
    Process(target=func, args=(conn1,conn2)).start()
    conn1.close() #主進程只需要一個connection,故關閉一個
    for i in range(20):
        conn2.send('吃了嗎') #主進程發送
    conn2.close() #主進程關閉connection2

管道是進程數據不安全的

  • pipe有數據不安全性 - 多個消費者同時取一個數據的情況可能發送
  • 通過IPC通訊
  • 解決方法 -加鎖
  • 隊列是進程數據安全的-隊列是基於管道加鎖
from multiprocessing import Process,Pipe,Lock

def consumer(p,name,lock):
    produce, consume=p
    produce.close()
    while True:
        lock.acquire()
        baozi=consume.recv()
        lock.release()
        if baozi:
            print('%s 收到包子:%s' %(name,baozi))
        else:
            consume.close()
            break


def producer(p,n):
    produce, consume=p
    consume.close()
    for i in range(n):
        produce.send(i)
    produce.send(None)
    produce.send(None)
    produce.close()

if __name__ == '__main__':
    produce,consume=Pipe()
    lock = Lock()
    c1=Process(target=consumer,args=((produce,consume),'c1',lock))
    c2=Process(target=consumer,args=((produce,consume),'c2',lock))
    p1=Process(target=producer,args=((produce,consume),10))
    c1.start()
    c2.start()
    p1.start()

    produce.close()
    consume.close()

    c1.join()
    c2.join()
    p1.join()
    print('主進程')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM