python多程序————10、程序間的通訊-Queue、Manager、Pipe
阿新 • • 發佈:2018-11-12
一、Queue
這裡提到的佇列模組大概有三個:
1、from queue import Queue (此模組適用於執行緒間通訊,但不能用於程序間通訊)
2、from multiprocessing import Queue (可以用於多程序,但不能用於程序池)
import time from multiprocessing import Process,Queue import queue def producer(queue): queue.put("a") time.sleep(2) def consumer(queue): time.sleep(2) data = queue.get() print(data) if __name__ == "__main__": #queue = queue.Queue() queue = Queue() my_producer = Process(target=producer,args=(queue,)) my_consumer = Process(target=consumer,args=(queue,)) my_producer.start() my_consumer.start() my_producer.join() my_consumer.join() #使用queue模組的Queue()會報錯 #使用multiprocessing中的Queue(),正確輸出a
3、from multiprocessing import Mnage
import time from multiprocessing import Process,Queue,Pool,Manager def producer(queue): queue.put("a") time.sleep(2) def consumer(queue): time.sleep(2) data = queue.get() print(data) if __name__ == "__main__": #queue = Queue() queue = Manager().Queue() pool = Pool() #pool中的程序間通訊需要使用Manager pool.apply_async(producer,args=(queue,)) pool.apply_async(consumer, args=(queue,)) pool.close() pool.join()
二、共享變數
共享變數不適用於多程序,程序間的變數是互相隔離的,子程序的全域性變數是完全複製一份父程序的資料,對子程序的全域性變數修改完全影響不到其他程序的全域性變數
def producer(a): a += 1 time.sleep(2) def consumer(a): time.sleep(3) data = a print(data) if __name__ == "__main__": a = 1 my_producer = Process(target=producer,args=(a,)) my_consumer = Process(target=consumer,args=(a,)) my_producer.start() my_consumer.start() my_producer.join() my_consumer.join() #輸出結果為1
三、管道Pipe(兩程序間的通訊優先考慮)
import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
def producer(pipe):
pipe.send("a")
time.sleep(3)
print(pipe.recv())
def consumer(pipe):
time.sleep(2)
data = pipe.recv()
pipe.send("b")
print(data)
if __name__ == "__main__":
#Pipe實現兩程序間通訊
s_pipe,r_pipe = Pipe()
pool = Pool()
pool.apply_async(producer,args=(s_pipe,))
pool.apply_async(consumer, args=(r_pipe,))
pool.close()
pool.join()
四、Manager
manager中的一些資料結構,dict使用(類似共享變數)
import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
import queue
def add_data(p_dict,key,value):
p_dict[key] = value
if __name__ == "__main__":
progress = Manager().dict()
first_progress = Process(target=add_data,args=(progress,"a",1))
second_process = Process(target=add_data,args=(progress,"b",2))
first_progress.start()
second_process.start()
first_progress.join()
second_process.join()
print(progress)