python - 从 multiprocessing.Process 继承的 Python 类的设置值问题

标签 python process multiprocessing local-variables

为什么这段代码

import multiprocessing
import time

class Bot(multiprocessing.Process):
    def __init__(self):        
        self.val = 0
        multiprocessing.Process.__init__(self)

    def setVal(self):
        self.val = 99

    def run(self):        
        while True:            
            print 'IN: ', self.val
            time.sleep(2)

if __name__ == '__main__':  
    bot = Bot()
    bot.start()
    bot.setVal()
    while True:
        print 'OUT: ', bot.val
        time.sleep(2)            

给出以下输出?

OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
...

正如你可能猜到的那样,我希望得到全部 99 个,IN 和 OUT。但我不。为什么?我错过了什么?

最佳答案

一旦你在你的对象上调用了 start() ,该对象内部的东西就在一个单独的进程中运行,并且使用该类的方法与其“通信”并不是真正的最好的办法。您需要做的就是所谓的进程间通信(简称IPC),并且有特殊的机制可以正确地完成它。

对于 Python 的 multiprocessing 模块,有两种进程之间通信的机制:PipeQueue。我建议研究一下这些(例如 here )。

要在示例中使用 Pipe 机制,您可以这样做(只是一个快速说明):

class Bot(multiprocessing.Process):
    def __init__(self, pipe):
        multiprocessing.Process.__init__(self)
        self.val = 0
        self.ipcPipe = pipe

    def run(self):
        while True: 
            newData = self.ipcPipe.recv()
            self.val = newData[0]
            print 'IN: ', self.val
            self.ipcPipe.send([self.val])
            time.sleep(2)

if __name__ == '__main__': 
    parent_conn, child_conn = multiprocessing.Pipe()
    bot = Bot(child_conn)
    bot.start()
    value = 0
    while True:
        value += 1
        parent_conn.send([value])
        outVal = parent_conn.recv()
        print 'OUT: ', outVal[0]
        time.sleep(2)

看看这里做了什么:我们创建了 Pipe 的父“端”和子“端”,并将子端赋予您的对象。然后,您可以在父进程中使用 send() 向对象传递新值,并使用 recv() 获取更新后的值。同样,在您的对象(记住,一个单独的进程)内部,您相反地在管道的另一端使用 send()recv() 与父进程通信。

此外,我建议在进行任何其他初始化之前在类 __init__ 方法中调用 Process.__init__(self) 。由于您是从 Process 继承的,因此在您自己的类中执行任何操作之前,最好确保引擎盖下的所有 process-y 内容都已正确初始化。

希望这有帮助。

关于python - 从 multiprocessing.Process 继承的 Python 类的设置值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569175/

相关文章:

Python 的 C++ 名称修改库

python - 稀疏观察矩阵的层次聚类

c# - 如何使用 C# 监视进程的 IO 事件?

go - 如何始终从 Go channel 获取最新值?

linux - freeRTOS 和并行处理

使用单个函数进行 Python 多处理

Python反向迭代分割单词

python - dropEvent() 没有被调用

Haskell:启动一个长时间运行的进程,默默地捕获标准输出

python - 如何使用Popen运行后台进程避免僵尸?