gpt4 book ai didi

Python 多处理 - 只是不明白

转载 作者:太空狗 更新时间:2023-10-29 22:14:08 25 4
gpt4 key购买 nike

我一直在花一些时间试图理解多处理,尽管未经训练的我无法理解它的细微之处。我已经能够得到一个池来返回一个简单的整数,但是如果函数不像我能找到的所有示例那样只返回结果(即使在 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)

有人可以用愚蠢的方式解释需要做什么,这样我才能最终理解我遗漏了什么以及它做了什么吗?

最佳答案

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

现在,您正在将对象发送到您的池中进行修改,并且 countSixes 不返回任何内容。这不适用于多处理,因为为了回避 GIL , multiprocessing 创建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))

关于Python 多处理 - 只是不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com