[英]Python multiprocessing asynchronous callback
我正在使用TKinter用GUI编写程序,用户可以单击一个按钮,然后启动一个新进程以使用multiprocess.Process
进行工作。 这是必要的,因此在完成工作时仍可以使用GUI,这可能需要几秒钟。
GUI还具有一个文本框,当事情发生时,在其中显示程序的状态。 这通常很简单,每个函数都调用一个add_text()
函数,该函数仅在文本框中打印文本。 但是,当在单独的进程中调用add_text()
时,文本不会以文本框结尾。
我已经考虑过使用Pipe
或Queue
,但是那将需要使用某种循环来检查该进程是否返回了任何东西,这也将导致主(GUI)进程不可用。 是否有某种方法可以在一个进程中调用某个函数,而该进程又可以在另一个进程中运行呢?
这是我正在尝试做的一个简单示例
import time
import multiprocessing as mp
import tkinter as tk
textbox = tk.Text()
def add_text(text):
# Insert text into textbox
textbox.insert(tk.END, text)
def worker():
x = 0
while x < 10:
add_text('Sleeping for {0} seconds'.format(x)
x += 1
time.sleep(1)
proc = mp.Process(target=worker)
# Usually happens on a button click
proc.start()
# GUI should still be usable here
异步事物实际上需要循环。 您可以使用Tk.after()方法将函数附加到TkInter的循环。
import Tkinter as tk
class App():
def __init__(self):
self.root = tk.Tk()
self.check_processes()
self.root.mainloop()
def check_processes(self):
if process_finished:
do_something()
else:
do_something_else()
self.after(1000, check_processes)
app=App()
我最终使用了multiprocessing.Pipe
,方法是使用TKinter的after()方法执行循环。 它按时间间隔循环并检查管道以查看是否有来自线程的消息,如果有,则将其插入文本框。
import tkinter
import multiprocessing
def do_something(child_conn):
while True:
child_conn.send('Status text\n')
class Window:
def __init__(self):
self.root = tkinter.Tk()
self.textbox = tkinter.Text()
self.parent_conn, child_conn = multiprocessing.Pipe()
self.process = multiprocessing.Process(target=do_something, args=(child_conn,))
def start(self):
self.get_status_updates()
self.process.start()
self.root.mainloop()
def get_status_updates()
status = self.check_pipe()
if status:
self.textbox.add_text(status)
self.root.after(500, self.get_status_updates) # loop every 500ms
def check_pipe():
if self.parent_conn.poll():
status = self.parent_conn.recv()
return status
return None
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.