我正在尝试在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()
PS。这个问题已经解决了。感谢您的回答!只是为了让任何读者都更容易,这是完整的工作版本:
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()
答案 0 :(得分:6)
将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
问题是这样的:在self.start()
中呼叫__init__
后,主要进程会分离子进程。将复制所有值。现在有p
的两个版本。在主进程中,p.sum
为0.在子进程中,调用run
方法并将p.sum
扩充为2.但是当主进程调用p.get_result()
时,它的p
版本仍然p.sum
等于0。
所以打印出0。
如果要在进程之间共享浮点值,则需要使用共享机制,例如mp.Value
。
有关如何共享值的更多选项,请参阅“Sharing state between processes”。
答案 1 :(得分:1)
self.sum
在这个过程中是2 ...
def run(self):
while True:
number = self.queue.get()
print "got %s from queue" % number
print "Before adding - self.sum = %d" % self.sum
self.sum += number
print "After adding - self.sum = %d" % self.sum
self.queue.task_done()
[ 13:56 jon@host ~ ]$ ./mp.py
got 1 from queue
Before adding - self.sum = 0
After adding - self.sum = 1
got 1 from queue
Before adding - self.sum = 1
After adding - self.sum = 2
有关如何让self.sum
在不同流程中保持一致,请参阅multiprocessing 16.3.1.4. - Sharing state between processes。