在遵循Python程序的过程中,当全局队列变空时,我做错了什么?

2024-04-19 15:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个小的虚拟程序,它可以得到一个列表输入

[1, 2, 3, 4]

那么输出应该是

{1:2, 2:4, 3:6, 4:8}

当我打印输出是

{1: 2}
{2: 4}
{3: 6}
{4: 8}
True
True
True
True
{}

但不知怎的,队列是空的。你知道吗

import Queue
import math
import multiprocessing   

out_q = Queue.Queue()

def mp_factorizer(nums):
    global out_q
    def worker(num):
        outdict = {}
        outdict[num] = num * 2
        print outdict
        out_q.put(outdict)

    procs = []
    for num in nums:
        p = multiprocessing.Process(target=worker,args=(num,))
        procs.append(p)
        p.start()

    resultdict = {}

    for p in procs:
        p.join()

    for i in range(len(nums)):
        print out_q.empty()
        if not out_q.empty():
            resultdict.update(out_q.get())

    # Wait for all worker processes to finish

    return resultdict

di = mp_factorizer([1, 2, 3, 4])
print di

Tags: inimporttrueforqueuedefoutmultiprocessing
1条回答
网友
1楼 · 发布于 2024-04-19 15:43:53

不要对队列对象使用全局。它不在进程之间共享。改为使用multiprocessing.Queue,并将其作为参数传入,以便对其进行管理:

def mp_factorizer(nums):
    out_q = multiprocessing.Queue()

    def worker(num, out_q):
        outdict = {}
        outdict[num] = num * 2
        print outdict
        out_q.put(outdict)


    procs = []

    for num in nums:
        p = multiprocessing.Process(
                target=worker,
                args=(num, out_q)
        )
        procs.append(p)
        p.start()

    for p in procs:
        p.join()

    resultdict = {}
    for i in range(len(nums)):
        if not out_q.empty():
            resultdict.update(out_q.get())

    return resultdict

相关问题 更多 >