python - 为什么我看不到 Python 主线程中子进程中写入的队列?

标签 python python-2.7 python-multiprocessing

我有一个使用多重处理的简单程序。它基本上执行数学运算并将结果写入队列。我可以看到队列大小在多处理函数内部增长,但是一旦我进入主线程/进程,队列就是空的。这似乎是某种我不理解的范围问题。有人可以解释为什么一旦在函数之外队列就为空吗?我已经尝试过将队列作为参数传递给函数以及其他方法,但它似乎总是空的。

from multiprocessing import Pool, Process
import math
import Queue

q = Queue.Queue(maxsize=0)


def compute_and_write(val):
    sq = val * val
    sq = math.sqrt(sq)
    sq = sq + sq + sq
    q.put("Q" + str(sq))
    print "Queue size (inside) = " + str(q.qsize())
    return sq


p = Pool(8)
y = []

for x in range(1, 100):
    y.append(x)

res = p.map(compute_and_write, y)
print "Queue size (outside) = " + str(q.qsize())

最佳答案

Queue.Queue 与跨进程行为方面的列表或字典没有什么不同:每个进程都有自己不同的对象,并且一个进程副本中的更改不会产生任何影响完全在任何其他进程的副本上。

您需要一个multiprocessing.Queue。它被设计为具有跨进程可见的状态。这就是它应该有的全部内容。

关于python - 为什么我看不到 Python 主线程中子进程中写入的队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49143359/

相关文章:

django - 无法将目标WSGI脚本'/var/www/backend/backend/wsgi.py'加载为Python模块

python - 无法使用 multiprocessing manager.dict() 共享对象实例

python - 分辨率增加时 np.gradient 的奇怪行为

python - Kivy 是否可以同时在不同的小部件上使用两个键盘?

python - 如何将包添加到系统路径进行测试

python - 如何终止多处理池进程?

python - 取消已挂起的 ProcessPoolExecutor future

python - 将列表中的字典键从 unicode 编码为 ascii

Python-我想使用 pandas 将第二行的列移动到第一行的列

python - 由于许多安装错误,无法在 RHEL 6.5 上使用 pip2.7 安装 python-ldap