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