使用多处理模块

2024-10-03 02:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python2.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.这个问题已经解决了。谢谢你的回答!为了方便读者阅读,以下是完整的工作版本:

^{pr2}$

Tags: 模块selfaddtruenumbergetqueueinit
2条回答

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

请参阅multiprocessing 16.3.1.4. - Sharing state between processes,了解如何使{}在不同进程中保持相同。在

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(),主进程就会分叉出一个子进程。将复制所有值。现在有两个版本的p。在主进程中,p.sum为0。在子进程中,调用run方法,p.sum被扩充为2。但是当主进程调用p.get_result()时,其版本的p仍然具有{}等于0。 所以0被打印出来了。在

当您想在进程之间共享浮点值时,需要使用共享机制,例如mp.Value。在

有关如何共享值的更多选项,请参见“Sharing state between processes”。在

相关问题 更多 >