有没有办法在后台运行python线程而不会在耗时的指令中锁定python的其余部分?
我正在尝试在python(pygtk)应用程序的后台线程中进行耗时的计算。我理解线程如何工作。问题是每次我在任何线程中运行一个昂贵的操作(例如:PIL的image.load()用于大图像),它会阻塞所有python线程,直到操作完成,即使它在一个单独的线程中。
那么,有没有办法在后台运行python线程而不会锁定其余的python? (只要他们没有锁定我的GUI,我就不在乎他们花了多长时间。我不能让我的GUI一次几秒钟没有响应)。使用sleep语句不起作用,因为我的问题是需要很长时间的单个命令(如image.load())。
答案 0 :(得分:3)
由于您使用的是pygtk,您是否致电threads_init()
?
对于较新版本:
>>> from gi.repository import GObject
>>> GObject.threads_init()
对于年长者:
>>> import gobject
>>> gobject.threads_init()
另外请确保不要从您的线程调用任何GUI方法,否则您的应用程序将以奇怪的方式中断。一个简单的方法是使用GObject.idle_add
:
idle_add(callable,user_data = None,priority = None) - >来源ID callable接收(user_data)
只要没有更高的优先级,就添加一个可调用的调用 挂起到默认主循环的事件。
答案 1 :(得分:1)
为了在后台进行处理,你也可以使用python的子进程。它将创建一个sub_process(独立于原始执行),您可以以特定间隔使用.poll来检查进程是否完成。如果运行.communicate,则整个进程将等待子进程完成。另外,您可以参考此文档: - threading-subprocess
我也相信有一些方法可以解决你的问题,只需在python中使用正常的线程。