多处理队列的负载为100%

时间:2018-11-01 11:36:50

标签: python

这只会复制我的问题,如果它试图控制共享队列上的循环,则会为主python脚本获得100%的负载

import multiprocessing
import random


def func1(num, q):
    while True:
        num = random.randint(1, 101)

        if q.empty():
            q.put(num)


def func2(num, q):
    while True:
        num = q.get()
        num = num ** 2
        if q.empty():
            q.put(num)


num = 2
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target=func1, args=(num, q))
p2 = multiprocessing.Process(target=func2, args=(num, q))
p1.daemon = True
p2.daemon = True
p1.start()
p2.start()
running = True
while running:
    if not q.empty():
        num = q.get(True, 0.1)
        print(num)

是否会有更好的方法从脚本控制多个工作进程。空载更好!?

1 个答案:

答案 0 :(得分:1)

我不确定我是否了解您的程序:

  • numfunc1()的{​​{1}}参数是什么?它永远不会被使用。
  • 如果func2()刚从队列中移出最后一个号码后,
  • func2将丢弃其结果。
  • 您为什么守护工人?您确定要这样做吗?
  • 主代码中的func1构造迟早会引发func2异常,因为它是它与if not q.empty(): q.get()中的queue.Empty之间的竞争。
  • 未捕获的q.get()异常将终止主进程,而使两个工作线程变成孤立的-并且正在运行。

一般建议:

  • 使用不同的队列来发布作业(请求队列)和收集结果(响应队列)。如有必要,将请求包括在响应中。
  • 考虑如何解雇工人。考虑一个“毒药”,即请求队列中导致工人死亡的值,即退出/终止。
  • 请务必确保您了解代码中的竞争条件,就像我上面提到的那样(空与获取)。

这是我破解的一些示例代码:

func2