在Python多進程中,進程和進程之間肯定是要通信的,Python的multiprocessing模塊包裝了底層的機制,提供了Queue、Pipes等多種方式來交換數據。
Pipe
進程之間的數據傳輸可以通過管道流的形式來處理, 通過特定的管道實現數據的傳輸。pipe就可以理解爲管道的處理形式
Pipe中有兩個方法:
send():發送
reciv():接收
import multiprocessing
def send_data(conn,data):#數據的發送
conn.send(['test1','test2',data])
def receive_data(conn):#數據接收
print("[接收數據]%s"%conn.recv())
def main():
conn_send,conn_recv = multiprocessing.Pipe()#管道
#創建兩個子進程,同時將兩個管道的對象傳遞到不同的進程處理函數之中
process_send = multiprocessing.Process(target=send_data,args=(conn_send,"www.baidu.com"))
process_receive = multiprocessing.Process(target=receive_data,args=(conn_recv,))
process_send.start()
process_receive.start()
if __name__ == '__main__':
main()
Queue
不同進程之間可以用管道實現數據的接收和發送,但是如果發送的數據過多或接收緩慢的時候,這種情況下就需要以隊列的形式來進行緩衝的操作實現
multiprocessing.Queue是多進程編程中提供的進程隊列結構,該隊列採用FIFO(first input first output)的形式實現不同進程間的數據通訊,這樣可以保證多個數據可以按序實現發送與接收處理
Queue方法:
put() 插入數據到隊列
get() 從隊列獲取數據
qsize() 獲取隊列保存數據的個數
empty() 是否爲空隊列
full() 是否爲滿隊列
import multiprocessing,time
def put_worker(queue): #隊列生產者
for item in range(50): #生產50次數據
time.sleep(1)
print("【%s】生產者數據,item = %s" %(multiprocessing.current_process().name,item))
queue.put("item = %s" % item)
def get_worker(queue):#隊列消費者
while True:
try:
print("【%s】消費數據:%s" % (multiprocessing.current_process().name,
queue.get(block=True,timeout=2)))
except:
pass
def main():#主函數
queue = multiprocessing.Queue()#創建進程延遲隊列
pool = multiprocessing.Pool(4)
producer_process = multiprocessing.Process(target=put_worker,name="生產者進程",args=(queue,))
consumer_process = multiprocessing.Process(target=get_worker,name="消費者進程",args=(queue,))
producer_process.start()
consumer_process.start()
producer_process.join()
consumer_process.join()
if __name__ == '__main__':
main()