首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Multiprocessing -就是不懂

Python Multiprocessing -就是不懂
EN

Stack Overflow用户
提问于 2011-06-15 23:57:31
回答 1查看 4K关注 0票数 6

我已经花了一些时间来尝试理解多进程,尽管它的细微之处会避开我未受过训练的头脑。我已经能够让一个池返回一个简单的整数,但是如果函数不像我能找到的所有示例那样返回一个结果(即使在documentation中,它也是一些我不太理解的晦涩的示例。

下面是我正在尝试使用的一个示例。但是,我不能让它像预期的那样工作,我相信有一个简单的原因。我可能需要使用队列或共享内存或管理器,但当我多次阅读文档时,我似乎无法理解它的实际含义和作用。到目前为止,我所能理解的就是池函数。

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

代码语言:javascript
复制
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)

有没有人可以用哑巴的方式解释一下需要做什么,这样我才能最终理解我错过了什么,它做了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-16 00:22:06

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

现在,您正在将对象发送到您的池中进行修改,并且没有从countSixes返回任何内容。这不适用于多处理,因为为了避开GIL,多处理创建counter的副本并将其发送到全新的解释器。因此,当您递增i时,您实际上是递增了i的副本,然后,因为您没有返回任何内容,所以您正在丢弃它!

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

代码语言:javascript
复制
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))
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6360679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档