在后台线程巨蟒/ pygtk的运行计算(Running computation in backgro

2019-09-21 13:24发布

有没有一种方法来在后台运行一个python线程,而不会在耗时的指令封锁住蟒蛇的休息吗?

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

那么,有没有一种方法来在后台运行一个python线程没有锁定下来蟒蛇的休息吗? (我不在乎他们需要多长时间,只要他们不锁定我的GUI。我只是不能有我的GUI在同一时间反应迟钝几秒钟)。 使用睡眠语句不工作,因为我的问题是与需要很长时间单一命令(如image.load())。

Answer 1:

由于您使用PyGTK的,你怎么叫threads_init()

对于较新的版本:

>>> from gi.repository import GObject
>>> GObject.threads_init()

而对于年纪稍长的:

>>> import gobject
>>> gobject.threads_init()

另外,还要确保你不会从你的线程或应用程序中调用任何GUI方法将在怪异的方式划分。 解决这个一个简单的方法是使用GObject.idle_add

idle_add(可调用,的user_data =无,优先权=无) - >源ID可调用接收(用户 - 数据)

添加一个调用被称为每当有挂起到默认主循环没有更高优先级的事件。



Answer 2:

有关后台做处理,你也可以去使用Python的子进程。 这将创建一个sub_process(独立于原始执行),以便您可以使用.poll以一定的间隔,如果这个过程完成检查。 如果你运行.communicate然后整个过程将等待子进程来完成。 此外,您还可以参考此文档: - 旋拧子

我也相信,有办法来解决你的问题,只是在python使用正常的线程。



文章来源: Running computation in background thread python/pygtk