1. 进程之间交换对象
并行应用常常需要在进程之间交换数据。
Multiprocessing库有两个Communication Channel可以交换对象:队列(queue)和管道(pipe)。
1.1. 使用队列交换对象
可以通过队列数据结构来共享对象。
Queue
返回一个进程共享的队列,是线程安全的,也是进程安全的。任何可序列化的对象(Python通过 pickable
模块序列化对象)都可以通过它进行交换。
例如:使用队列来实现生产者-消费者问题。 Producer
类生产item放到队列中,然后 Consumer
类从队列中移除它们。
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import multiprocessing
import random
import time
class Producer(multiprocessing.Process):
def __init__(self, queue):
multiprocessing.Process.__init__(self)
self.queue = queue
def run(self):
for i in range(10):
item = random.randint(0, 256)
self.queue.put(item)
print("Process Producer : item %d appended to queue %s" % (item, self.name))
time.sleep(1)
print("The size of queue is %s" % self.queue.qsize())
class Consumer(multiprocessing.Process):
def __init__(self, queue):
multiprocessing.Process.__init__(self)
self.queue = queue
def run(self):
while True:
if self.queue.empty():
print("the queue is empty")
break
else:
time.sleep(2)
item = self.queue.get()
print('Process Consumer : item %d popped from by %s \n' % (item, self.name))
time.sleep(1)
if __name__ == '__main__':
queue = multiprocessing.Queue() #主程序中创建 Queue 实例
process_producer = Producer(queue) #创建生产者进程
process_consumer = Consumer(queue) #创建消费者进程
process_producer.start()
process_consumer.start()
process_producer.join()
process_consumer.join()