隊列:
# 生產者 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)