Queue和pipe的区别在于Pipe常用在两个进程间通信,Queue用来在多个进程间实现通信。
Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。有两个方法:put和get
- Put 方法用于插入数据到队列中,它还有两个可选参数:blocked和timeout.如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked
- Get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果过、blocked为False,分两种情况:如果Queue有一个值可用,则立即返回该值;否则,如果队列为空,则立即抛出Queue.Empty。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from multiprocessing import Process, Queue import os, time, random def proc_write(q, urls): print('Process(%s) is writing...' % os.getpid()) for url in urls: q.put(url) print('Put %s to queue...' % url) time.sleep(random.random()) def proc_read(q): print('Process(%s) is reading...' % os.getpid()) while True: url = q.get(True) print('Get %s from queue..' % url) if __name__ == '__main__': q = Queue() proc_write1 = Process(target=proc_write, args=(q, ['url_1', 'url_2', 'url_3'])) proc_write2 = Process(target=proc_write, args=(q, ['url_4', 'url_5', 'url_6'])) proc_reader = Process(target=proc_read, args=(q,)) # 启动子进程proc_writer,写入 proc_write1.start() proc_write2.start() # 启动子进程pro_reader,读取 proc_reader.start() # 等待proc_writer结束 proc_write1.join() proc_write2.join() # proc_reader进程是死循环,无法等待其结束,只能强行终止 proc_reader.terminate()运行结果如下:
Process(26932) is writing... Put url_1 to queue... Process(35528) is writing... Put url_4 to queue... Process(30088) is reading... Get url_1 from queue.. Get url_4 from queue.. Put url_5 to queue... Get url_5 from queue.. Put url_2 to queue... Get url_2 from queue.. Put url_3 to queue... Get url_3 from queue.. Put url_6 to queue... Get url_6 from queue.. Process finished with exit code 0