我在python 3.8中使用PyQt5制作了一个gui应用程序。但是,当我从GUI命令执行繁重的多线程CPU密集型任务(GUI线程没有被占用)时,GUI变得非常无响应(很可能是由于CPU集中在工作任务上)。
我的问题是,有没有办法优先考虑gui的线程在python,使工人不会减慢gui ?我使用threading.Thread(target=task, daemon=True).start()
来运行线程。
线程优先级不是你可以做的事情,但是有一些方法可以绕过它来拥有一个响应式GUI。
- 改变系统。将switchchinterval设置为较低的值(可能为0.001)
使python更频繁地切换线程,以便GUI可以更快地响应事件,并且感觉响应更快。
- 使用多进程代替线程进行计算
除了可以使用更多的CPU内核之外,还可以控制每个进程的亲和性和优先级,这样即使在加载的系统上,也可以保证GUI保持更高的优先级。
- 更频繁地释放GIL
通常,如果您可以选择在python中完成的操作和在C扩展(如numpy或pandas)中完成的操作,则C扩展可以释放GIL,因此您的GUI可以保留更长时间的GIL。
在上面的解决方案中,最常用的(即使在非python程序中)是使用多处理,因为它比"响应式gui"有更多的好处,第三种是"在编码时"的"推荐",所以在编写应用程序时要记住它。