Python多处理-只是没有得到它

Python多处理-只是没有得到它,python,python-3.x,multiprocessing,pool,python-2.7,Python,Python 3.x,Multiprocessing,Pool,Python 2.7,我花了一些时间试图理解多重处理,尽管它的优点让我无法理解。我已经能够得到一个池来返回一个简单的整数,但是如果这个函数不只是像我能找到的所有示例那样返回一个结果(即使在中,这是一些我不太理解的模糊示例) 这是一个我正在努力工作的例子。但是,我不能让它按预期工作,我相信这有一个简单的原因。我可能需要使用队列、共享内存或管理器,但很多时候当我阅读文档时,我似乎无法理解它的实际含义和作用。所有这些我都能够理解到目前为止的anding是pool函数 另外,我使用一个类,因为我需要避免使用全局变量 有人能用

我花了一些时间试图理解多重处理,尽管它的优点让我无法理解。我已经能够得到一个池来返回一个简单的整数,但是如果这个函数不只是像我能找到的所有示例那样返回一个结果(即使在中,这是一些我不太理解的模糊示例)

这是一个我正在努力工作的例子。但是,我不能让它按预期工作,我相信这有一个简单的原因。我可能需要使用队列、共享内存或管理器,但很多时候当我阅读文档时,我似乎无法理解它的实际含义和作用。所有这些我都能够理解到目前为止的anding是pool函数

另外,我使用一个类,因为我需要避免使用全局变量


有人能用哑巴的语言解释一下需要做什么,这样我才能最终理解我遗漏了什么以及它的作用吗?

我花了一段时间才理解您想要发生什么。问题与多处理的工作方式有关。基本上,您需要以函数式的方式编写程序,而不是像您一样依赖于副作用现在就做

现在,您正在将要修改的对象发送到池中,并且从
countSixes
中不返回任何内容。这在多处理中不起作用,因为为了避开这个问题,多处理创建了
计数器的副本,并将其发送到一个全新的解释器。因此,当您增加
i
时,实际上是在增加删除一份
i
,然后,因为您不返回任何内容,所以您将丢弃它

要做一些有用的事情,您必须从
countSixes
返回一些东西。下面是一个简化版本的代码,它的功能与您想要的类似。我在中留下了一个参数,只是为了说明您应该做什么,但实际上这可以通过零参数函数来完成

import random

def countSixes(start):
    newNum = random.randrange(0,10)
    if newNum == 6:
        return start + 1
    else:
        return start

if __name__ == '__main__':
    import multiprocessing
    pool = multiprocessing.Pool(1) #use one core for now

    start = 0
    async_results = [pool.apply_async(countSixes, (start,)) for i in range(1000)]

    print(sum(r.get() for r in async_results))

重读你的问题,我现在明白了,你认为使用类可以避免。它不会。如果你真的想在进程之间共享内存(文档本身建议不要!)然后,您必须使用所描述的
多处理
的内置数据类型。先生,您是一位绅士和学者。我可以用它来重构我的程序以返回一个类实例(这也是我需要类的原因),现在一切正常了!没有您的解释,我不可能做到这一点
import random

def countSixes(start):
    newNum = random.randrange(0,10)
    if newNum == 6:
        return start + 1
    else:
        return start

if __name__ == '__main__':
    import multiprocessing
    pool = multiprocessing.Pool(1) #use one core for now

    start = 0
    async_results = [pool.apply_async(countSixes, (start,)) for i in range(1000)]

    print(sum(r.get() for r in async_results))