4

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

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

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

4

2 回答 2

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) -> source id callable接收(user_data)

每当没有更高优先级的事件挂起到默认主循环时,添加一个要调用的可调用对象。

于 2012-08-23T17:06:06.790 回答
1

为了在后台进行处理,您还可以使用 python 的子进程。它将创建一个 sub_process (独立于原始执行),您可以使用 .poll 在特定时间间隔检查该过程是否已完成。如果您运行 .communicate 则整个进程将等待子进程完成。另外,您可以参考此文档:-threading-subprocess

我也相信有一些方法可以解决你的问题,只需在 python 中使用普通线程即可。

于 2012-08-23T15:31:41.180 回答