urllib2冻结了GUI

时间:2010-11-04 19:45:33

标签: python pygtk

我正在使用PyGTK开发我正在开发的小应用程序。通过代理使用URLlib2将冻结我的GUI。反正有没有阻止它?

我实际完成工作的代码是与GUI分开的,所以我想可能正在使用subprocess来调用python文件。但是,如果我将应用程序转换为exe文件,那该怎么办?

由于

2 个答案:

答案 0 :(得分:6)

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

使用glib中的异步IO工具或在单独的线程中调用urllib2以避免此问题。

答案 1 :(得分:0)

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

只需要一对Queue个对象即可完成简单设计(只需两个进程)。 urllib2进程简单地使用来自其请求队列的请求,并将响应发布到结果队列。另一方面的进程可以异步操作,发布请求,并从事件循环中的任何位置(或从单独的线程),拉出响应并将它们发送回字典或调度回调函数(可能还维护为字典) )。

(例如,我可能让请求模型创建一个回调处理对象,使用对象的ID作为键将其存储在字典中,并将该ID的元组和URL发布到请求队列,然后具有响应处理拉动ID和响应队列的响应文本,以便事件处理循环然后可以将响应分派给对象的.callback()方法,该方法存储在字典中以开始。响应可以是URL文本结果但是也可以实现对Exception个对象的处理(可能在我们的假设回调对象的接口中调度到.errback()方法)。当然,如果我们的主GUI是多线程的,我们必须确保对该字典的一致访问然而,对此的争论应该相对较少。对该词典的所有访问都是非阻塞的。

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

如果需要将GUI分散到可以共享相同urllib2进程或池的多个进程中,那么就应该查找消息总线(例如,传播或AMQP)。共享内存和multiprocess锁定原语也可以使用;但这需要相当多的努力。