这可能是由于持有Python的GIL的工作线程引起的。在某些Python实现中,一次只能执行一个Python线程。GIL阻止其他线程执行Python代码,并在不需要GIL的函数调用期间被释放。
例如,由于IO是由 *** 作系统而不是Python解释器处理的,因此在实际IO期间会释放GIL。
解决方案:
显然,您可以
time.sleep(0)
在工作线程中使用以屈服于其他线程(根据此SO问题)。您将必须定期调用time.sleep(0)
自己,并且GUI线程仅在后台线程调用此函数时运行。如果辅助线程足够独立,则可以将其置于完全独立的进程中,然后通过在管道上发送腌制对象进行通信。在前台进程中,创建一个工作线程来与后台进程进行IO。由于工作线程将执行IO而不是CPU *** 作,因此它将不保存GIL,这将为您提供完全响应的GUI线程。
某些Python实现(JPython和IronPython)没有GIL。
CPython 中的 线程
仅对多路IO *** 作非常有用,而对于将CPU密集型任务放在后台并不有用。对于许多应用程序而言,CPython实现中的线程从根本上被破坏了,并且在可预见的未来很可能会保持这种状态。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)