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

时间:2012-10-11 00:41:49

标签: python multiprocessing

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

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

def fun2():
    p.terminate()

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

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

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

2 个答案:

答案 0 :(得分:2)

所以 - ypu可能已经在某处读过“使用全局变量不是一个好的实践” - 这就是原因。您的“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循环中使用,或者其他什么。

* 编辑 - 我刚刚看到你正在使用它来回答Tkinter中的按钮按下 程序,所以,你必须在按钮点击之间的某个地方记录Process实例。 没有你的代码重构,并假设你打算坚持 在全局变量方法中,您可以简单地在里面创建Process实例 “fun1” - 这可行:

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

def fun2():
    p.terminate()

答案 1 :(得分:1)

terminate一个进程it's dead。例如,您可能能够重构流程以便能够与其进行通信using pipes。如果子进程表现不佳,那可能很难做到。否则,您可以为每组参数创建Process的新实例。