Python urllib2冻结GUI

Python urllib2冻结GUI,python,pygtk,Python,Pygtk,我正在使用PyGTK开发一个小应用程序。通过代理使用URLlib2将冻结我的GUI。有没有办法防止这种情况发生 我的代码实际上是独立于GUI的,所以我想可能是使用子进程来调用python文件。但是,如果我要将应用程序转换为exe文件,该如何工作 感谢从主线程调用urllib2会阻塞Gtk事件循环,从而冻结用户界面。这不是特定于urllib2的,而是在任何较长时间运行的函数(例如子流程调用)中发生的 使用glib的异步IO功能或在单独的线程中调用urllib2以避免此问题。从主线程调用urllib

我正在使用PyGTK开发一个小应用程序。通过代理使用URLlib2将冻结我的GUI。有没有办法防止这种情况发生

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


感谢从主线程调用urllib2会阻塞Gtk事件循环,从而冻结用户界面。这不是特定于urllib2的,而是在任何较长时间运行的函数(例如
子流程调用
)中发生的


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

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


要么使用来自GLIB的异步IO设施,要么在单独的线程中调用URLILB2来避免这个问题。

< P>我会考虑使用<代码>多进程< /C>模块,创建一对<代码>队列对象…一个用于GUI控制器或其他组件向
urllib2
进程发送请求;另一个用于返回结果

仅一对
队列
对象就足以进行简单的设计(仅两个进程)。
urllib2
processsimple使用来自其请求队列的请求,并将响应发布到结果队列。另一方的进程可以异步运行,发布请求,并从事件循环中的任何位置(或从单独的线程)提取响应并将其发回字典或调度回调函数(可能也作为字典维护)

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

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


如果GUI需要分散到多个进程中,这些进程可以共享同一个
urllib2
进程或池,那么应该寻找消息总线(例如spread或AMQP)共享内存和<代码>多进程< /代码>锁定原语也可以使用,但这将涉及更多的努力。

< P>我会考虑使用<代码>多进程模块,创建一对队列对象…GUI控制器或其他组件之一将请求发送到<代码> URLILB2进程。;另一个用于返回结果

仅一对
队列
对象就足以进行简单的设计(仅两个进程)。
urllib2
进程简单使用来自其请求队列的请求,并将响应发布到结果队列。另一端的进程可以异步操作,发布请求,并从事件循环中的任何位置发布响应(或从一个单独的线程中),将响应取出并将其发回字典或分派回调函数(可能也作为字典维护)

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

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


如果GUI需要分散到多个进程中,这些进程可以共享同一个
urllib2
进程或池,那么应该寻找消息总线(例如spread或AMQP)。共享内存,也可以使用
多进程
锁定原语;但这需要付出更多的努力。

有关于这方面的教程吗?我在谷歌上找不到任何好的例子。我不知道这方面的任何教程。你必须阅读文档并自己思考。是的,好的,我会尝试这样做。是吗有关于这个的教程吗?我在谷歌上找不到任何好的例子。我不知道有关于这个的教程。你必须阅读文档