我正在尝试使用 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()
Change self.sum = 0
to 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
问题是这样的:一旦你打电话self.start()
in __init__
,主进程派生出一个子进程。所有值均被复制。现在有两个版本p
。在主流程中,p.sum
为 0。在子进程中,run
方法被调用并且p.sum
增至2。但是当主进程调用时p.get_result()
,其版本为p
仍然有p.sum
等于 0。
所以打印0。
当想要在进程之间共享浮点值时,需要使用共享机制,例如mp.Value
.
See "在进程之间共享状态 http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes” 了解有关如何分享价值观的更多选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)