gpt4 book ai didi

python - 使用多处理模块

转载 作者:太空狗 更新时间:2023-10-30 00:57:27 25 4
gpt4 key购买 nike

我正在尝试在 python 2.6 中使用多处理模块,但显然有一些我不明白的地方。我希望下面的类将 add() 发送给它的数字相加,并在 get_result() 方法中返回总和。下面的代码打印“0”,我希望它打印“2”。我错过了什么?

import multiprocessing

class AdderProcess(multiprocessing.Process):

def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = 0
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()

def run(self):
while True:
number = self.queue.get()
self.sum += number
self.queue.task_done()

def add(self, number):
self.queue.put(number)

def get_result(self):
self.queue.join()
return self.sum


p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()

附言。这个问题已经解决了。感谢您的回答!为了让任何读者更容易理解,这里是完整的工作版本:

import multiprocessing

class AdderProcess(multiprocessing.Process):

def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = multiprocessing.Value('d', 0.0)
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()

def run(self):
while True:
number = self.queue.get()
self.sum.value += number
self.queue.task_done()

def add(self, number):
self.queue.put(number)

def get_result(self):
self.queue.join()
return self.sum.value

p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()

最佳答案

self.sum = 0 更改为 self.sum = multiprocessing.Value('d', 0.0),并使用 self.sum.value 访问或更改值。

class AdderProcess(multiprocessing.Process):    
def __init__(self):
...
self.sum = multiprocessing.Value('d', 0.0)
...
def run(self):
while True:
number = self.queue.get()
self.sum.value += number # <-- use self.sum.value
self.queue.task_done()
def get_result(self):
self.queue.join()
return self.sum.value # <-- use self.sum.value

问题是这样的:在 __init__ 中调用 self.start() 后,主进程会 fork 出一个子进程。复制所有值。现在有两个版本的p。在主进程中,p.sum为0。在子进程中,调用run方法,将p.sum增为2 .但是当主进程调用p.get_result()时,其版本的p仍然有p.sum等于0。所以 0 被打印出来。

当你想在进程之间共享一个浮点值时,你需要使用共享机制,比如mp.Value

有关如何分享值(value)观的更多选项,请参阅“Sharing state between processes”。

关于python - 使用多处理模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7780478/

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