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

在后台线程python/pygtk中运行计算,python,multithreading,pygtk,python-imaging-library,gil,Python,Multithreading,Pygtk,Python Imaging Library,Gil,有没有一种方法可以在后台运行python线程,而不用在耗时的指令中锁定python的其余部分 我试图在python(pygtk)应用程序的后台线程中进行耗时的计算。我了解线程是如何工作的。问题是,每次我在任何线程中运行一个昂贵的操作(例如:对于大型图像,PIL的image.load()),它都会阻塞所有python线程,直到操作完成,即使它位于单独的线程中 那么,有没有一种方法可以在后台运行python线程而不锁定python的其余部分?(我不在乎它们需要多长时间,只要它们不锁定我的GUI。我就

有没有一种方法可以在后台运行python线程,而不用在耗时的指令中锁定python的其余部分

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


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

要在后台进行处理,还可以使用python的子进程。它将创建一个sub_进程(独立于原始执行),您可以使用。每隔一定时间轮询以检查进程是否完成。若运行.communicate,则整个流程将等待子流程完成。此外,您还可以参考本文件:-


我还相信,只要在python中使用普通线程,就可以解决这个问题

既然您正在使用pygtk,您是否调用了
threads\u init()

对于较新版本:

>>> from gi.repository import GObject
>>> GObject.threads_init()
对于老年人:

>>> import gobject
>>> gobject.threads_init()
还要确保不要从线程调用任何GUI方法,否则应用程序将以奇怪的方式崩溃。解决这个问题的简单方法是使用
GObject.idle\u add

空闲添加(可调用,用户数据=无,优先级=无)->源id 可调用接收(用户数据)

在没有更高优先级时添加可调用的 挂起到默认主循环的事件


查看GIL(全局解释器锁)并可能查看多处理程序包。。。如果您使用普通线程,它们应该共享cpu时间。。。但是长时间的不可中断调用会阻塞我使用的是线程模块。我的问题是,在不相关的线程中进行昂贵的操作时,它会锁定所有线程(包括Gui,它会变得无响应)。+1@JoranBeasley,多处理与线程非常相似,因此修改现有代码以使用它应该相当直接,谢谢!我不知道相当简单的部分,因为找到在进程之间快速传输数据的方法是一件非常痛苦的事情,但是python的多线程包确实解决了我的问题。:)谢谢,但我正在尝试在后台运行(非gtk)内容,而不会使gtk主线程暂停。将内容作为空闲函数移动到主gtk线程与我的尝试方向相反。@James我不是要在空闲添加回调中运行所有内容。您仍然运行单独的线程,就像现在一样。但是,当该线程需要更新gui(一个进度条、一个标签,…)时,就可以在idle_add回调中这样做。