我想用python脚本创建两个进程。需要通过tkinter按钮启动和停止这些进程。进程正确启动,但未终止。使用tkinter按钮正确终止进程的最简单方法是什么?哪种最佳实践方法?
from tkinter import *
import multiprocessing
def print1():
global a
while a == True:
print('im process 1')
def print2():
global a
while a == True:
print('im process 2')
def start():
process1.start()
process2.start()
def stop():
global a
a = False
a = True
if __name__ == '__main__':
process1 = multiprocessing.Process(target = print1)
process2 = multiprocessing.Process(target = print2)
root = Tk()
root.title("Title")
root.geometry("200x200")
app = Frame(root)
app.grid()
start = Button(app, text="Start", command=start)
stop = Button(app, text="Stop", command=stop)
start.grid()
stop.grid()
root.mainloop()
process1.join()
process2.join()
问题似乎出在停止方法中。
我想我可能知道问题是什么,但我不是100%确定。原因的答案似乎在python文档中。这里的代码运行良好(我编辑了语法并将tkk
用于按钮,看起来更好(:
from tkinter import *
from tkinter import ttk
import multiprocessing
def print1():
global a
while a is True:
print('im process 1')
def print2():
global a
while a is True:
print('im process 2')
def start():
process1.start()
process2.start()
def stop():
process1.kill()
process2.kill()
a = True
if __name__ == '__main__':
process1 = multiprocessing.Process(target=print1)
process2 = multiprocessing.Process(target=print2)
root = Tk()
root.title("Title")
root.geometry("200x200")
app = Frame(root)
app.grid()
start = ttk.Button(app, text="Start", command=start)
stop = ttk.Button(app, text="Stop", command=stop)
start.grid(padx=15, pady=20)
stop.grid(column=1, row=0)
root.mainloop()
process1.join()
process2.join()
希望这有帮助!
普通变量不会在multiprocessing.Process
的实例之间共享。
这意味着您的:
global a
是每个进程中不同的全局变量,与主 Python 程序中的第三个global a
分开。 因此,当您使用 tk 按钮将最后一个a
设置为 False
,通过process1
记住的过程中a
仍然是True
,就像通过process2
记住的过程中的a
一样。
您可以跨进程共享变量。 有两种方法可以做到这一点:通过Manager
实例或通过共享内存。 共享内存效率更高,但更难使用,并且有时具有操作系统依赖项,因此,如果您不需要特别高的性能,请考虑使用 Manager。