【问题标题】:Python Multiprocessing - Just not getting itPython多处理 - 只是没有得到它
【发布时间】:2011-06-15 15:57:30
【问题描述】:

我一直在花一些时间试图理解多处理,尽管它的一些细节让我未经训练的头脑无法理解。我已经能够得到一个池来返回一个简单的整数,但是如果该函数不只是像我能找到的所有示例那样返回一个结果(即使在documentation 中,它也是一些我无法找到的晦涩示例很明白。

这是我尝试开始工作的一个示例。但是,我无法让它按预期工作,而且我确信有一个简单的原因。我可能需要使用队列或共享内存或管理器,但在阅读文档时,我似乎无法理解它的实际含义和作用。到目前为止,我所能理解的只是池函数。

另外,我正在使用一个类,因为我需要避免使用this question's answer 中的全局变量。

import random

class thisClass:
    def __init__(self):
        self.i = 0

def countSixes(myClassObject):
    newNum = random.randrange(0,10)
    #print(newNum) #this proves the function is being run if enabled
    if newNum == 6:
        myClassObject.i += 1

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

    counter = thisClass()

    myList = []
    [myList.append(x) for x in range(1000)]

    #it must be (args,) instead of just i, apparently
    async_results = [pool.apply_async(countSixes, (counter,)) for i in myList]

    for x in async_results:
        x.get(timeout=1)

    print(counter.i)

有人可以愚蠢地解释需要做什么,以便我最终了解我缺少什么以及它做了什么吗?

【问题讨论】:

  • 重读你的问题,我现在明白你认为使用类可以避免this problem。它不会。如果您真的想在进程之间共享内存(文档本身不建议这样做!),那么您必须使用multiprocessing 的内置数据类型,如here 所述。

标签: python python-3.x multiprocessing pool python-2.7


【解决方案1】:

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

现在,您正在将对象发送到您的池中以进行修改,并且从 countSixes 没有返回任何内容。这不适用于多处理,因为为了避开GIL,多处理会创建counter副本,并将其发送给全新的解释器。因此,当您增加 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))

【讨论】:

  • 您先生是一位绅士和一位学者。我能够使用它来重新设计我的程序以返回一个类实例(这也是我需要类的原因),现在一切正常!没有你的解释,我不可能做到! 舞蹈
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多