python multiprocessing写生产者和消费者问题

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写多进程那么蛋疼。

你可能感兴趣的:(python)