如何解决Python多重处理-只是没有得到它
|| 我花了一些时间尝试理解多处理,尽管它的优点在于逃避了我未经训练的头脑。我已经能够获得一个返回简单整数的池,但是如果函数不仅仅像我可以找到的所有示例一样返回结果(即使在文档中,这也是一个晦涩的示例,不太明白。 这是我尝试开始工作的示例。但是,我无法使其按预期运行,并且我确定有一个简单的原因。我可能需要使用队列,共享内存或管理器,但是阅读文档的次数似乎无法使我全神贯注于它的真正含义和作用。到目前为止,我所能了解的只是pool函数。 另外,我正在使用一个类,因为我需要避免在此问题的答案中使用全局变量。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,多重处理会创建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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。