• 技术文章 >后端开发 >Python教程

    python多进程中的生产者和消费者模型怎么实现

    王林王林2023-04-27 20:22:04转载85

    Python生产者消费者模型

    一、消费模式

    生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式。用于两个CPU之间传输数据,即使是不同类型同一厂家的CPU也可以通过设置来使用。

    二、传输原理

    python多进程中的生产者和消费者模型怎么实现

    三、实现方式

    方法一:

    import threading,queue,time
    # 创建一个队列,队列最大长度为2
    q = queue.Queue(maxsize=2)
    def product():
        while True:
            # 生产者往队列塞数据
            q.put('money')
            print('生产了money, 生产时间:', time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    def consume():
        while True:
            time.sleep(0.5)
            # 消费者取出数据
            data = q.get()
            print('消费了%s, 消费时间%s' % (data, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
    t = threading.Thread(target=product)
    t1 = threading.Thread(target=consume)
    t.start()
    t1.start()

    缺点:

    实现了多少个消费者consumer进程,就需要在最后往队列中添加多少个None标识,方便生产完毕结束消费者consumer进程。否则,p.get() 不到任务会阻塞子进程,因为while循环,直到队列q中有新的任务加进来,才会再次执行。而我们的生产者只能生产这么多东西,所以相当于程序卡死。

    方法二:

    from multiprocessing import JoinableQueue,Process
    import time
    def producer(q):
        for i in range(4):
            time.sleep(0.5)
            f = '生产者:已经生产'
            q.put(f)
            print(f)
        q.join()  # 一直阻塞,等待消耗完所有的数据后才释放
    def consumer(name, q):
        while True:
            food = q.get()
            print('\033[消费者:消费了%s\033' % name)
            time.sleep(0.5)
            q.task_done()  # 每次消耗减1
    if __name__ == '__main__':
        q = JoinableQueue()  # 创建队列
        # 模拟生产者队列
        p1 = Process(target=producer, args=(q, ))
        p1.start()
        # 模拟消费者队列
        c1 = Process(target=consumer, args=('money', q))
        c1.daemon = True  # 守护进程:主进程结束,子进程也会结束
        c1.start()
        p1.join()  # 阻塞主进程,等到p1子进程结束才往下执行

    优点:

    以上就是python多进程中的生产者和消费者模型怎么实现的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Python
    上一篇:Python如何实现高配版王者小游戏 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • vscode如何远程调试python代码• python如何删除文件夹中具有相同后缀类型文件• python在linux哪个文件夹中• 怎么用Python编写个有趣的记仇本• 一位国外老程序员的反思:C、Python、Java 不可兼得,专心学好一门编程语言就行!
    1/1

    PHP中文网