1

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

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

def fun2():
    p.terminate()

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

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

如果我尝试这样做,我会收到一条错误消息,说我不能多次调用同一个进程。有解决方法吗?

4

2 回答 2

2

所以 - ypu 可能在某处读到“使用全局变量不是一个好习惯” - 这就是原因。您的“p”变量仅包含一个“进程”实例,并且它只能启动(和终止)一次。

如果你重构你的代码,让“fun1”和“fun2”把它们作为参数的进程,或者可能以OO方式,其中fun1和fun2是方法,进程是一个实例变量,你不会有任何这些问题。

在这种情况下,OO 可以快速查看并直接使用:

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 - I just saw ou are using this as answer to a button press in a Tkinter program, so, you have to record the Process instance somewhere between button clicks. Without having your code to refactor, and supposing you intend to persist on your global variable approach, you can simply create the Process instance inside "fun1" - this would work:

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

def fun2():
    p.terminate()
于 2012-10-11T03:54:52.857 回答
1

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

于 2012-10-11T01:14:23.127 回答