#-*- coding: utf-8 -*-
"""多进程 生产者 消费者模型,使用队列实现 multiprocessing.Queue
逻辑:
1个生产者,1个消费者在2个不同的进程中操作同一个队列
生产者的速度是消费者的3倍"""
importmultiprocessingimportrandomimporttime#生产者
classproducer(multiprocessing.Process):def __init__(self, queue):
multiprocessing.Process.__init__(self) #父类构造
self.queue =queuedefrun(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())#消费者
classconsumer(multiprocessing.Process):def __init__(self, queue):
multiprocessing.Process.__init__(self) #父类构造
self.queue =queuedefrun(self):whileTrue:if(self.queue.empty()):print("the queue is empty")break
else:
time.sleep(2)#从队列读取数据,队列为空会阻塞,这做了非空判断,只有一个进程读,不会阻塞
item =self.queue.get()print("Process Consumer: item %d poped from by %s"\%(item, self.name))
time.sleep(1)if __name__ == '__main__':#多进程共享对列
queue =multiprocessing.Queue()## 启动生产者、消费者
process_producer =producer(queue)
process_consumer=consumer(queue)
process_producer.start()
process_consumer.start()
process_producer.join()
process_consumer.join()"""Out:
the queue is empty
Process Producer: item 225 appended to queue producer-1
The size of queue is 1
Process Producer: item 101 appended to queue producer-1
The size of queue is 2
Process Producer: item 50 appended to queue producer-1
The size of queue is 3
Process Producer: item 217 appended to queue producer-1
The size of queue is 4
Process Producer: item 75 appended to queue producer-1
The size of queue is 5
Process Producer: item 45 appended to queue producer-1
The size of queue is 6
Process Producer: item 19 appended to queue producer-1
The size of queue is 7
Process Producer: item 157 appended to queue producer-1
The size of queue is 8
Process Producer: item 127 appended to queue producer-1
The size of queue is 9
Process Producer: item 223 appended to queue producer-1
The size of queue is 10"""