python多进程中使用生产者消费者模式对进程的执行顺序进行控制

代码


from multiprocessing import Process, Queue


def consumer(q):
    while True:
        res = q.get()
        if res is None: break  # 收到结束信号则结束
        print('\033[45m 吃 %s\033[0m' % ( res))


def producer(name, q):
        res = '%s' % (name)
        q.put(res)
        print('\033[44m 生产了 %s\033[0m' % ( res))


if __name__ == '__main__':
    q = Queue()
    # 生产者们:即厨师们
    p1 = Process(target=producer, args=('包子', q))
    p2 = Process(target=producer, args=('馒头', q))
    p3 = Process(target=producer, args=('花卷', q))

    # 消费者们:即吃货们
    c1 = Process(target=consumer, args=(q,))
    c2 = Process(target=consumer, args=(q,))

    # 开始
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

    p1.join()  # 必须保证生产者全部生产完毕,才应该发送结束信号
    p2.join()
    p3.join()
    q.put(None)  # 有几个消费者就应该发送几次结束信号None
    q.put(None)  # 发送结束信号

输出

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的多线程问题,但是在Python,我们也可以使用多进程来解决这个问题。 下面是一个使用Python多进程处理生产者消费者问题的示例代码: ```python import multiprocessing import time # 生产者 def producer(queue): for i in range(5): print('Producing', i) queue.put(i) time.sleep(1) # 消费者 def consumer(queue): while True: item = queue.get() if item is None: break print('Consuming', item) time.sleep(2) if __name__ == '__main__': queue = multiprocessing.Queue() producer_process = multiprocessing.Process(target=producer, args=(queue,)) consumer_process = multiprocessing.Process(target=consumer, args=(queue,)) producer_process.start() consumer_process.start() producer_process.join() queue.put(None) consumer_process.join() ``` 在这个示例代码,我们使用Python的`multiprocessing`模块来创建了两个进程,一个是生产者进程,一个是消费者进程。我们使用了一个`multiprocessing.Queue`对象来作为生产者和消费者之间的通信管道。生产者进程会不断地向这个管道添加数据,而消费者进程则会不断地从管道取出数据进行处理。 运行这个代码,你会看到生产者进程不断地输出生产的数据,而消费者进程则不断地输出消费的数据。当生产者进程生产完所有数据后,我们向管道添加了一个`None`对象,以此来通知消费者进程数据已经处理完毕,可以退出了。最后,我们使用`join()`方法来等待两个进程都退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值