from time import time
from time import sleep
from multiprocessing import Process, Queue
import multiprocessing as mp
import random
def get_process_idx():
return mp.current_process()._identity[0]
def consumer(myqueue):
for i in range(5):
result = myqueue.get()
print('Process{}: consume result:{} '.format(get_process_idx(),result))
sleep(0.2 * random.random())
def producer(myqueue):
for i in range(5):
result = random.random()
myqueue.put(result)
print('Process{}: produce result:{} '.format(get_process_idx(), result))
sleep(0.2 * random.random())
def main():
queue = Queue()
st = time()
consumer_list = [Process(target=consumer, args=(queue,)) for _ in range(5)] # 5 consumers
producer_list = [Process(target=producer, args=(queue,)) for _ in range(5)] # 5 producers
for i in range(5):
consumer_list[i].start()
producer_list[i].start()
sleep(0.5)
print('The main process can also run!')
for i in range(5):
producer_list[i].join()
consumer_list[i].join()
if __name__ == "__main__":
main()
输出:
Process6: produce result:0.7980437995602082
Process1: consume result:0.7980437995602082
Process6: produce result:0.6964217548571279 Process1: consume result:0.6964217548571279
Process7: produce result:0.2978159324178927
Process2: consume result:0.2978159324178927
Process6: produce result:0.17818916524122852
Process6: produce result:0.6029254783995365
Process2: consume result:0.17818916524122852
Process1: consume result:0.6029254783995365
Process2: consume result:0.3600079250057805
Process7: produce result:0.3600079250057805
Process8: produce result:0.913012046010522
Process2: consume result:0.913012046010522
Process6: produce result:0.37486844508773387
Process3: consume result:0.37486844508773387
The main process can also run!
Process7: produce result:0.39852102716186033
Process1: consume result:0.39852102716186033
Process8: produce result:0.5478443045458551
Process4: consume result:0.5478443045458551
Process7: produce result:0.40159627290519384
Process1: consume result:0.40159627290519384
Process9: produce result:0.10454674925087826
Process8: produce result:0.06369777804225396
Process3: consume result:0.10454674925087826
Process2: consume result:0.06369777804225396
Process7: produce result:0.5359514045672161
Process4: consume result:0.5359514045672161
Process8: produce result:0.47331961869501293
Process3: consume result:0.47331961869501293
Process9: produce result:0.34366138897147935
Process5: consume result:0.34366138897147935
Process10: produce result:0.044588902012483
Process4: consume result:0.044588902012483
Process10: produce result:0.03577255756347597
Process9: produce result:0.5750994658950933
Process8: produce result:0.13134188773835842
Process4: consume result:0.03577255756347597
Process3: consume result:0.5750994658950933
Process5: consume result:0.13134188773835842
Process9: produce result:0.45333928847698013
Process4: consume result:0.45333928847698013
Process10: produce result:0.3819280323130264
Process3: consume result:0.3819280323130264
Process9: produce result:0.7451667564233875
Process5: consume result:0.7451667564233875
Process10: produce result:0.782545501862475
Process5: consume result:0.782545501862475
Process10: produce result:0.3452227694112342
Process5: consume result:0.3452227694112342
看起来生产者和消费者这样交替打印,很大的原因是用了multiprocessing的Queue的get函数,如果队列为空的话,会阻塞,等到有资源的时候才释放,这是进程安全的。不像以前用c写多进程那么蛋疼。