使用多处理模块

Mat*_*erg 5 python multiprocessing

我正在尝试在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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 6

更改self.sum = 0self.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
Run Code Online (Sandbox Code Playgroud)

问题是这样的:当你打电话self.start()__init__,主要工艺叉掉一个子进程.将复制所有值.现在有两个版本p.在主进程中,p.sum为0.在子进程中,该run方法被调用并p.sum扩充为2.但是当主进程调用时p.get_result(),其版本p仍然p.sum等于0.因此打印0.

如果要在进程之间共享浮点值,则需要使用共享机制,例如mp.Value.

有关如何共享值的更多选项,请参阅" 在进程之间共享状态 ".