python多处理成员变量未设置

标签 python multiprocessing

在下面的脚本中,我得到“收到停止消息”输出,但该过程永远不会结束。这是为什么?除了终止或 os.kill 之外,还有其他方法可以结束进程吗?

from multiprocessing import Process
from time import sleep

class Test(Process):
    def __init__(self):
        Process.__init__(self)
        self.stop = False

    def run(self):
        while self.stop == False:
            print "running"
            sleep(1.0)

    def end(self):
        print "stop message received"
        self.stop = True

if __name__ == "__main__":
    test = Test()
    test.start()
    sleep(1.0)
    test.end()
    test.join()

最佳答案

start 方法已将对象克隆到一个单独的进程中,并在其中执行 runend 方法没有什么特别的,因此它在调用它的进程中运行——它对该对象执行的更改不会发送到克隆对象。

因此,请使用适当的进程间通信方式,例如 multiprocessing.Event实例,例如:

from multiprocessing import Process, Event
from time import sleep

class Test(Process):
    def __init__(self):
        Process.__init__(self)
        self.stop = Event()

    def run(self):
        while not self.stop.is_set():
            print "running"
            sleep(1.0)

    def end(self):
        print "stop message received"
        self.stop.set()

if __name__ == "__main__":
    test = Test()
    test.start()
    sleep(1.0)
    test.end()
    test.join()

如您所见,所需的更改很少。

关于python多处理成员变量未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685845/

相关文章:

python - python中的关系数据结构

python - 如何使用 extras 和版本说明符 pip install -e?

Python:使用多处理模块作为可能的解决方案来提高我的功能的速度

python - django多图片上传将上传的图片存储在列表中

python - 使用 {tuple :float} format 来自 dict 的 x 和 y 标签在 python matplotlib 中创建热图

python /多处理 : howto simplify "def" fields

python - Python 中进程如何在彼此之间共享列表?

multiprocessing - Python 3.4多进程抛出TypeError(“无法序列化'_io.BufferedReader'对象”,)

Python 2.7 正则表达式捕获组未按预期工作

python - 是否可以在Python中复制一个管道,使其具有一个写入端和两个读取端?