美文网首页
多进程 - 队列

多进程 - 队列

作者: 冬至是条狗 | 来源:发表于2018-12-08 22:33 被阅读0次

multiprocessing.Queue

  • q = multiprocessing.Queue()
  • q.put(x) # 向队列中放入一个值
  • q.get() # 从队列中取一个值
  • q.empty() # 判断队列是否为空
  • q.full() # 判断队列是否满了
  • q.get_nowait() # 从队列中取值,如果队列为空,则抛出异常。普通get()方法为空时堵塞
  • q.qsize() # 求取队列长度

生产者消费者模型

用来解决数据供需的平衡问题

  • 生产者 -- 进程
  • 消费者 -- 进程
import multiprocessing
import time
import random


def consumer(q, name):
    while True:
        food = q.get()
        if food is None:
            print("%s 拿到一个空" % name)
            break
        print("\033[31m%s 消费了 %s\033[0m" %(name, food))
        time.sleep(random.randint(1, 3))


def producer(name, food, q):
    for i in range(10):
        f = "%s生产的 %s %s" % (name, food, i)
        print(f)
        q.put(f)
        time.sleep(1)


if __name__ == "__main__":
    q = multiprocessing.Queue(20)
    p = multiprocessing.Process(target=producer, args=("Sun", "包子", q))
    p.start()
    p2 = multiprocessing.Process(target=producer, args=("Wang", "泔水", q))
    p2.start()
    c1 = multiprocessing.Process(target=consumer, args=(q, "1号"))
    c1.start()
    c2 = multiprocessing.Process(target=consumer, args=(q, "2号"))
    c2.start()
    p.join()
    p2.join()
    q.put(None)
    q.put(None)

JoinableQueue

使用阻塞方式等待队列空闲后退出

import multiprocessing
import time
import random

def consumer(q, name):
    while True:
        food = q.get()
        print("\033[31m%s 消费了 %s\033[0m" %(name, food))
        time.sleep(random.randint(1, 3))
        q.task_done()


def producer(name, food, q):
    for i in range(10):
        f = "%s生产的 %s %s" % (name, food, i)
        print(f)
        q.put(f)
        time.sleep(1)
    q.join()


if __name__ == "__main__":
    q = multiprocessing.JoinableQueue(20)
    p1 = multiprocessing.Process(target=producer, args=("Sun", "包子", q))
    p1.start()
    p2 = multiprocessing.Process(target=producer, args=("Wang", "泔水", q))
    p2.start()
    c1 = multiprocessing.Process(target=consumer, args=(q, "1号"))
    c2 = multiprocessing.Process(target=consumer, args=(q, "2号"))

    c1.daemon = True
    c2.daemon = True

    c1.start()
    c2.start()

    p1.join()
    p2.join()

相关文章

  • iOS底层-- 进程、线程、队列

    手动目录:基本概念进程线程任务队列相互之间的关联、区分、特点进程与线程的关系队列的特点线程与队列主线程和主队列多线...

  • 队列

    多线程队列 多进程队列

  • Linux性能分析工具简介

    系统CPU 概念 运行队列统计包括正在运行的进程和在就绪队列等待的进程如果就绪队列等待的进程越多,代表争抢CPU越...

  • 多进程

    队列先进先出,与队列相反的是栈,先进后出 通过队列实现进程间通讯 进程池

  • 调度队列

    作业队列: 进程进入系统,会被加到作业队列,这个队列包含系统所有的进程 就绪队列: 驻留在内存中的、就绪的、等待运...

  • 139-Ubuntu16.04服务器下Supervisor实现p

    Supervisor是Linux系统中常用的进程守护程序,如果队列进程意外关闭,它会自动重启启动队列进程 。 [S...

  • 多线程开发中的一些基本概念的理解

    进程、线程、队列(串行队列、并行队列)、同步(dispatch_sync)、异步(dispatch_async)、...

  • 生产者和消费者模型-队列

    队列(进程通信ipc) 队列主要用于解决进程间通信的问题,队列底层就是通过管道和锁的方式实现的。 代码示例: 主要...

  • 并发编程-队列(进程与线程中的队列用法一样)

    队列 Queue 方法: 队列中的数据是进程安全的,同一时间,只有一个进程能够对队列中的数据进行修改。 一般队列 ...

  • 高性能网站实用技巧之消息队列

    什么是消息队列? 消息队列(Message Queue)是一种进程间通信或同一进程的不同线程间的通信方式。进程或者...

网友评论

      本文标题:多进程 - 队列

      本文链接:https://www.haomeiwen.com/subject/nqdchqtx.html