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

在这里插入图片描述

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