我正在使用python 2.7多处理模块。我想启动一个进程,然后终止它,然后用新参数再次启动它。
p = Process(target=realwork, args=(up, down, middle, num))
def fun1():
p.start()
def fun2():
p.terminate()
在程序流程中(通过循环和事件),我按顺序调用函数:
fun1()
fun2()
fun1()
fun2()
如果我尝试我收到错误,说我不能多次调用同一个进程。有解决方法吗?
答案 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
的新实例。