Python進程通信—— multiprocessing.Pipe()|Queue()

在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()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章