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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值