我正在使用 python 2.7 多处理模块。我想启动一个进程,然后终止它,然后使用新参数再次启动它。
p = Process(target=realwork, args=(up, down, middle, num))
def fun1():
p.start()
def fun2():
p.terminate()
在程序流程(通过循环和事件)过程中,我按以下顺序调用函数:
fun1()
fun2()
fun1()
fun2()
如果我尝试这样做,我会收到一条错误消息,指出我无法多次调用同一进程。有解决办法吗?
所以 - 您可能在某处读过“使用全局变量不是一个好的做法” - 这就是原因。你的“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()