2010-11-04 127 views
1

我正在使用PyGTK开发一个小应用程序。通过代理使用URLlib2会冻结我的GUI。无论如何要阻止这一点?urllib2冻结GUI

我的代码实际上做的工作是从GUI分离,所以我想可能是使用子进程来调用python文件。但是,如果我将应用程序转换为exe文件,该如何工作?

由于

回答

6

从主线程块调用的urllib2 GTK的事件循环,因而冻结用户界面。这不是特定于urllib2,而是与任何更长时间运行的函数(例如subprocess.call)发生。

要么使用glib中的异步IO设施,要么在独立的线程中调用urllib2来避免此问题。

+0

有没有关于此的任何教程?我在Google上找不到任何好的示例。 – Pwnna 2010-11-04 21:02:28

+0

我不知道这个任何教程。你必须阅读文档并为自己思考。 – lunaryorn 2010-11-05 15:16:30

+0

是的,我会尽力做到这一点。 – Pwnna 2010-11-06 16:33:23

0

我会考虑使用multiprocess模块,创建一对Queue对象...一个用于GUI控制器或其他组件发送请求到urllib2进程;另一个用于返回结果。

只需一对Queue对象就足够简单的设计(只有两个过程)。流程简单处理来自请求队列的请求,并向结果队列发布响应。另一方面的进程可以异步操作,发布请求,并从事件循环中的任何地方(或从一个单独的线程)提取响应并将它们发回字典或调度回调函数(可能还被维护为字典)。 (例如,我可能有请求模型创建一个回调处理对象,使用对象的ID作为关键字将其存储在字典中,并将该ID和URL的元组发送到请求队列,然后响应处理请求响应队列的ID和响应文本,以便事件处理循环可以将响应调度到存储在字典中的对象的.callback()方法开始。响应可以是URL文本结果,但可以处理Exception对象也可以实现(也许在我们假设的回调对象的接口中分派到.errback()方法)。当然,如果我们的主GUI是多线程的,我们必须确保对这个字典的连贯访问,但是应该有相对较低的争用。所有访问这个词典y是非阻塞的)。

更复杂的设计是可能的。一个urllib2处理进程池可以共享一对Queue对象(这些队列的优点是它们处理我们所有的锁定和一致性细节;支持多个生产者/消费者)。

如果需要将GUI分成多个进程,这些进程可以共享相同的进程或池,那么就需要查找消息总线(例如传播或AMQP)。共享内存和锁定原语也可以使用;但那会涉及更多的努力。