進程之間如何進行通信?


隊列:

# 生產者
def producer(name, food, q):
    for i in range(20):
        time.sleep(random.random())

        f = "%s 制作了的第%s個%s" % (name, i, food)
        print(f)

        # 將數據放入隊列中
        q.put(f)


# 消費者
def chibaozi(name, q):
    while 1:
        # 在隊列中取值
        food = q.get()

        # 不能用字符形式格式,需要用is關鍵字才能和none配合
        if food is None:
            break
        print("%s 消費了 %s" % (name, food))


if __name__ == '__main__':
    # 創建一個隊列
    q = Queue()

    # 生產者
    qq = Process(target=producer, args=('Mark', '包子', q))
    qq1 = Process(target=producer, args=('Riven', '饅頭', q))

    # 消費之
    qq2 = Process(target=chibaozi, args=('黃埔', q))
    qq3 = Process(target=chibaozi, args=('佘義', q))

    # 統一啟動子進程
    qq.start()
    qq1.start()
    qq2.start()
    qq3.start()

    # 先執行子程序,后執行主程序代碼
    qq.join()
    qq1.join()

    # 放入None 讓消費者跳出循環
    q.put(None)
    q.put(None)

 

管道:

from multiprocessing import Manager
from multiprocessing import Process
from multiprocessing import Lock

def main(dic,lock):

    # 加鎖
    lock.acquire()
    dic['count'] -= 1
    print('子進程', dic)
    lock.release()


if __name__ == "__main__":
    # 雖然進程間數據獨立,但可以通過Manager實現數據共享,事實上Manager的功能遠不止於此
    m = Manager()

    lock = Lock()

    # 放入一個字典
    dic = m.dict({"count": 100})


    for i in range(20):
        p = Process(target=main, args=(dic,lock))
        p.start()


        p.join()
    print('測試', dic)


免責聲明!

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



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