Python 如何从多进程中收集结果?

Python 如何从多进程中收集结果?,python,multiprocessing,Python,Multiprocessing,我的python代码有问题。我想要的是每个进程都写在一个字典中。我得到的是每个进程都会写入自己的字典 为了说明这一点: 运行代码后:我得到以下输出: P 0: {0: 1} P 2: {2: 1} P 4: {4: 1} P 6: {6: 1} P 8: {8: 1} All: {} 我想要的是: P 0: {0: 1} P 2: {2: 1} P 4: {4: 1} P 6: {6: 1} P 8: {8: 1} All: {0: 1, 2: 1, 4: 1, 6: 1, 8: 1} 以下

我的python代码有问题。我想要的是每个进程都写在一个字典中。我得到的是每个进程都会写入自己的字典

为了说明这一点: 运行代码后:我得到以下输出:

P 0: {0: 1}
P 2: {2: 1}
P 4: {4: 1}
P 6: {6: 1}
P 8: {8: 1}
All: {}
我想要的是:

P 0: {0: 1}
P 2: {2: 1}
P 4: {4: 1}
P 6: {6: 1}
P 8: {8: 1}
All: {0: 1, 2: 1, 4: 1, 6: 1, 8: 1}
以下是我的示例代码:

from multiprocessing import Process, Lock, cpu_count

class multiprocessingExample():

    global d
    d = {}
    global lock
    lock = Lock()

    def __init__(self):
        pass

    def proc(self, num):

            global lock
            global d
            with lock:
                if(num in d):
                    d[num] = d[num] + 1
                else:
                    d[num] = 1
                print("P " + str(num) + ": " + str(d))

    def main(self):
        jobs = []

        for i in range(0, 10):
            if(i%2 == 0):
                p = Process(target=self.proc, args=(i,))
                jobs.append(p)

        for job in jobs:
            job.start()

        for job in jobs:
            job.join()

        print("All: " + str(d))

obj = multiprocessingExample()
obj.main()

如果您能告诉我出了什么问题,那就太好了。

您似乎没有正确地使用
global
。它用于确保每当您提到
变量时,您指的是全局范围内的变量:

#global scope
count = 0

def fun():
    #local variables
    local_count = 0

    # 'when I say "do something to `count`",
    # I mean the global variable'

    global count

    count += 1
您需要首先声明这些变量,如下所示:

from multiprocessing import Process, Lock, cpu_count

# initialize global variables

d = {}
lock = Lock()

class multiprocessingExample():

    global d
    # here you're overwriting them, so previous
    # values are no longer available.
    # you probably shouldn't do this, better initialize them
    # in global namespace

    #d = {}
    global lock
请注意,您还可以执行
global d、lock等操作,因此您不必每次都编写
global

不要使用global,使用a:

这将输出如下内容:

P 0: {0: 1}
P 2: {0: 1, 2: 1}
P 4: {0: 1, 2: 1, 4: 1}
P 8: {0: 1, 8: 1, 2: 1, 4: 1}
P 6: {0: 1, 8: 1, 2: 1, 4: 1, 6: 1}
All: {0: 1, 8: 1, 2: 1, 4: 1, 6: 1}

“不要使用全局”本身就是一个很好的答案。感谢您将我介绍给
Manager
@msw,不用担心,这里有一个Manager.dict,您有嵌套的dict,在这种情况下,您需要合并一个Manager.list
P 0: {0: 1}
P 2: {0: 1, 2: 1}
P 4: {0: 1, 2: 1, 4: 1}
P 8: {0: 1, 8: 1, 2: 1, 4: 1}
P 6: {0: 1, 8: 1, 2: 1, 4: 1, 6: 1}
All: {0: 1, 8: 1, 2: 1, 4: 1, 6: 1}