繁体   English   中英

Python多处理异步回调

[英]Python multiprocessing asynchronous callback

我正在使用TKinter用GUI编写程序,用户可以单击一个按钮,然后启动一个新进程以使用multiprocess.Process进行工作。 这是必要的,因此在完成工作时仍可以使用GUI,这可能需要几秒钟。

GUI还具有一个文本框,当事情发生时,在其中显示程序的状态。 这通常很简单,每个函数都调用一个add_text()函数,该函数仅在文本框中打印文本。 但是,当在单独的进程中调用add_text()时,文本不会以文本框结尾。

我已经考虑过使用PipeQueue ,但是那将需要使用某种循环来检查该进程是否返回了任何东西,这也将导致主(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM