当有人建议我使用Twisted时,我一直在努力让一些异步活动在PyGTK下工作。
我知道Twisted最初是一个网络框架,但它可以用于其他事情。但是,我见过的每个例子都涉及很多基于网络的代码。我想看一个使用Twisted作为一个简单的PyGTK桌面应用程序的例子,而不需要花费额外的精力来理解事物的网络方面。
那么:是否有一个干净,简单的教程或使用Twisted创建GTK(PyGTK)应用程序并执行异步任务的示例?
(是的,我见过pbgtk2.py。它没有注释,以网络为中心,对新手来说完全莫名其妙。)
已更新:我列出了glib.idle_add
/ gtk.gdk.lock
以及在Windows下无法正常工作的朋友的各种抱怨。这一切都在pygtk list上得到了解释 - PyGTK需要一些技巧才能在Windows下运行异步行为。
然而,我的观点仍然表明,无论何时我提到在PyGTK中进行异步活动,有人说“不要使用线程,请使用Twisted!”我想知道原因和方法。
答案 0 :(得分:2)
扭曲执行是pygtk中的异步任务uses functions,例如gobject.io_add_watch
/ glib.io_add_watch
和gobject.timeout_add
/ glib.timeout_add
(加上其他一些,你会发现它们)在gobject和glib module)中,所以使用原始pygtk函数没有太大区别,或者如果你不需要网络就没有太大差异。
由于添加扭曲与pygtk具有异步任务相同的问题,twisted使用与pygtk相同的循环,因此如果执行某些阻塞任务则会被阻止!
最好的办法是使用基本上用于处理此类情况的glib functions之一。
我已经在一个应用程序中测试了在twisted + pygtk的窗口下的正确行为但是我避免做阻塞的东西(从大文件中读取最大值,每块大块的块基本上使用glib.idle_add
或glib.io_add_watch
,在扭曲中使用类似的东西)。
例如,我不确定产生进程和处理带有glib.io_add_watch
的stdout似乎不起作用。我写了一个article on my blog来处理pygtk中异步进程的执行,虽然它可能取决于版本,但不太确定它适用于Windows。