Python DearPyGui 多线程与异步

Posted 何小有

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python DearPyGui 多线程与异步相关的知识,希望对你有一定的参考价值。

对于一些需要长时间运行的计算和回调,我们可以使用在单线程上运行的异步方法,使用很简单,只需要调用 run_async_function 方法即可,需要注意的是,使用异步命令运行的方法中,不能调用 DearPyGui 的对象与方法。

from dearpygui.core import *
from dearpygui.simple import *
from time import sleep

add_additional_font(file='MicrosoftYaHei.ttf', size=18.0, glyph_ranges='chinese_simplified_common')

def long_async_callback(data, sender):
    run_async_function(long_callback, None)

def long_callback(sender, data):
    sleep(3)

show_logger()
show_metrics()

with window("Tutorial"):
    add_button("耗时方法", callback=long_callback, tip="This will cause a 3 second freeze")
    add_button("耗时异步方法", callback=long_async_callback, tip="This will not freeze")

start_dearpygui()

异步方法中无法访问 add_dataget_data,因此,当需要将数据传递到异步函方法时,我们必须使用 datareturn_handler 参数,所有的 Python 对象都可以通过 data 参数发送到方法中。此外,通过指定返回回调的 data 输入,可以让异步方法访问任何数据。

from dearpygui.core import *
from dearpygui.simple import *
from time import sleep

add_additional_font(file='MicrosoftYaHei.ttf', size=18.0, glyph_ranges='chinese_simplified_common')

def long_async_preparer(sender, data):
    floaty = get_value("异步输入数据")
    run_async_function(long_callback, floaty, return_handler=long_async_return)

def long_callback(sender, data):
    sleep(3)
    return data * 2

def long_async_return(sender, data):
    log_debug(data)

def long_callback2(sender, data):
    sleep(3)
    log_debug(data * 2)

show_logger()

with window("Tutorial"):
    add_text("输入一个数字,然后在logger窗口中查看回调的输出,该回调通常会使整个GUI冻结")
    add_input_float("异步输入数据", default_value=1.0)
    add_button("耗时方法", callback=long_callback2, callback_data=get_value("异步输入数据"),
               tip="This is the long callback that will freeze the gui")
    add_button("耗时异步方法", callback=long_async_preparer, tip="this will not a freeze the GUI")

start_dearpygui()

当调用异步方法时,将创建一个 线程池,我们可以配置 线程数线程超时时间。通过 set_thread_count 我们可以设置 线程池 中的线程数,也可以通过 set_threadpool_high_performance线程池 的最大线程数设置为计算机的最大值。

需要注意,调用异步方法时,CPU 将以 100% 的速度运行,因此,我们可以通过 set_threadpool_timeout 设置线程池中每个线程的超时时间,这样,在超出设定的时间后,将自动销毁线程并释放资源。

以上是关于Python DearPyGui 多线程与异步的主要内容,如果未能解决你的问题,请参考以下文章

Python多线程,多进程,并行,并发,异步编程

生产者消费者模型实现多线程异步交互

Python网络编程通过ThreadingMixIn实现多线程异步套接字程序

python 多进程/多线程/协程 同步异步

Python DearPyGui 项目实践

C# Winform 多线程异步委托进度条