在后台线程python / pygtk中运行计算

时间:2012-08-23 14:56:46

标签: python multithreading pygtk python-imaging-library gil

有没有办法在后台运行python线程而不会在耗时的指令中锁定python的其余部分?

我正在尝试在python(pygtk)应用程序的后台线程中进行耗时的计算。我理解线程如何工作。问题是每次我在任何线程中运行一个昂贵的操作(例如:PIL的image.load()用于大图像),它会阻塞所有python线程,直到操作完成,即使它在一个单独的线程中。

那么,有没有办法在后台运行python线程而不会锁定其余的python? (只要他们没有锁定我的GUI,我就不在乎他们花了多长时间。我不能让我的GUI一次几秒钟没有响应)。使用sleep语句不起作用,因为我的问题是需要很长时间的单个命令(如image.load())。

2 个答案:

答案 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中使用正常的线程。