PySidePyQt-启动占用大量CPU的线程会挂起整个应用程序

PySidePyQt-启动占用大量CPU的线程会挂起整个应用程序,第1张

PySide / PyQt-启动占用大量CPU的线程会挂起整个应用程序

这可能是由于持有Python的GIL的工作线程引起的。在某些Python实现中,一次只能执行一个Python线程。GIL阻止其他线程执行Python代码,并在不需要GIL的函数调用期间被释放。

例如,由于IO是由 *** 作系统而不是Python解释器处理的,因此在实际IO期间会释放GIL。

解决方案:

  1. 显然,您可以

    time.sleep(0)
    在工作线程中使用以屈服于其他线程(根据此SO问题)。您将必须定期调用
    time.sleep(0)
    自己,并且GUI线程仅在后台线程调用此函数时运行。

  2. 如果辅助线程足够独立,则可以将其置于完全独立的进程中,然后通过在管道上发送腌制对象进行通信。在前台进程中,创建一个工作线程来与后台进程进行IO。由于工作线程将执行IO而不是CPU *** 作,因此它将不保存GIL,这将为您提供完全响应的GUI线程。

  3. 某些Python实现(JPython和IronPython)没有GIL。

CPython 中的 线程
仅对多路IO *** 作非常有用,而对于将CPU密集型任务放在后台并不有用。对于许多应用程序而言,CPython实现中的线程从根本上被破坏了,并且在可预见的未来很可能会保持这种状态。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647590.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存