如何从工作进程将计数器返回给 GUI,同时尽可能减少工作进程的阻塞以及尽可能少地等待 gui?

问题描述 投票:0回答:1

我有一个 GUI,它在单独的进程中启动两个单独的程序(可以并行运行)。 我想在程序运行时更新集体进度条。到目前为止,我一直通过两个 multiprocessing.Variables (每个工作进程一个)来完成此操作。每次成功迭代后,工作进程都会获取其 multiprocessing.Variable 的锁,并递增计数器(在这两种情况下,Variable 都是 int 类型的计数器)。 gui 正忙于循环 - 在循环中,gui 尝试访问(获取锁定)multiprocessing.Variable1 并读取值,然后访问 multiprocessing.Variable2 并读取其值。如果 gui 读取新值,则进度条会更新。

提高“绩效”的措施。图形用户界面读取每个计数器后,它将休眠一段时间,以减少繁忙的等待(如果进度条没有一一计数,而是时不时地跳跃一点,那也没有多大关系)。工作进程正在获取超时锁,以便尽可能少地阻塞(以防 gui 当前正在读取值并因此阻塞任何写入)。 有什么建议如何解决这个问题,让进度条尽可能减少 Slow_down 和 cpu 使用率的增加?

python performance tkinter multiprocessing shared-memory
1个回答
0
投票

您需要“用户事件”来生成一个工作线程,该线程启动并加入另一个进程(或至少等待其结果),然后为了从另一个线程更新GUI,您需要调用执行函数的

tk.after(0, update_function, args)
在你的主线程中传递
args
,它允许你更新 GUI。

下面的例子说明了这一点。

import tkinter
import multiprocessing
import threading



def process_worker_task(multiproc_queue: multiprocessing.Queue, number: int):
    multiproc_queue.put(number)

def thread_worker_task():
    global current_number
    current_number += 1
    queue = multiprocessing.Queue()
    process = multiprocessing.Process(target=process_worker_task, args=(queue, current_number))
    process.start()
    process.join()
    result = queue.get()
    tk.after(0, update_text,result)

def update_text(number: int):
    text_message.config(text=str(number))
    
thread = None

def start_worker_thread():
    global thread
    thread = threading.Thread(target=thread_worker_task)
    thread.start()

if __name__ == "__main__":
    tk = tkinter.Tk()
    current_number = 0
    button = tkinter.Button(tk,text="do stuff", command=start_worker_thread)
    button.pack()
    text_message = tkinter.Label(tk,text="Hello ...")
    text_message.pack()
    tk.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.