如何在程序中多次调用同一个进程

问题描述 投票:0回答:2

我正在使用 python 2.7 多处理模块。我想启动一个进程,然后终止它,然后使用新参数再次启动它。

p = Process(target=realwork, args=(up, down, middle, num))
def fun1():
    p.start()

def fun2():
    p.terminate()

在程序流程(通过循环和事件)过程中,我按以下顺序调用函数:

fun1()
fun2()
fun1()
fun2()

如果我尝试这样做,我会收到一条错误消息,指出我无法多次调用同一进程。有解决办法吗?

python multiprocessing
2个回答
3
投票

所以 - 您可能在某处读过“使用全局变量不是一个好的做法” - 这就是原因。你的“p”变量只保存一个“Process”实例,并且它只能启动(和终止)一次。

如果您重构代码,以便“fun1”和“fun2”采用它们充当参数的过程,或者可能在 O.O.方式,其中 fun1 和 fun2 是方法,而 Process 是实例变量,您不会遇到任何这些问题。

在这种情况下,O.O.易于查看且易于使用:

class MyClass(object):
    def __init__(self):
        self.p = Process(target=realwork,args=(up,down,middle,num))
    def fun1(self):
        self.p.start()

    def fun2(self):
        self.p.terminate()

然后,无论您需要对“fun1”和“fun2”进行一对调用,您都可以:

action = Myclass()
action.fun1()
action.fun2() 

相反。即使在 for 循环或其他循环中,这也可以工作。

*edit - 我刚刚看到你正在使用它作为 Tkinter 中按钮按下的答案 程序,因此,您必须在按钮单击之间的某个位置记录 Process 实例。 无需重构代码,并且假设您打算坚持下去 在您的全局变量方法中,您可以简单地在内部创建 Process 实例 “fun1” - 这会起作用:

def fun1():
    global p
    p = Process(target=realwork,args=(up,down,middle,num))
    p.start()

def fun2():
    p.terminate()

1
投票

一旦你

terminate
一个进程,它就死了。例如,您也许能够重组进程,以便能够与它进行通信使用管道。如果子进程表现不佳,这可能很难做到正确。否则,您可以为每组参数创建一个新的
Process
实例。

© www.soinside.com 2019 - 2024. All rights reserved.