我写了一个Rhythmbox插件,我试图添加一些代码来异步下载一些JSON。回调注册在do_activate
功能:如何从插件调用Twisted到已经运行主循环的GTK程序?
def do_activate(self):
shell = self.object
sp = shell.props.shell_player
self.db = shell.get_property('db')
self.qm = RB.RhythmDBQueryModel.new_empty(self.db)
self.pec_id = sp.connect('playing-song-changed', self.playing_entry_changed)
self.pc_id = sp.connect('playing-changed', self.playing_changed)
self.sc_id = sp.connect('playing-source-changed', self.source_changed)
self.current_entry = None
...
我想,当playing_changed
被触发下载一些内容。它目前使用urllib2
同步下载内容,但这可能会在短时间内阻止用户界面。我想用Twisted来解决这个问题,但是我所见过的所有例子都使用了reactor.run()
,它们会无限期地阻止。
我很新来扭曲,我想知道,有没有办法处理这种情况异步处理,而不阻止主线程?
完整的代码here
这不是“矫枉过正”。即使你想在一个线程中执行你的请求,Twisted的deferToThread提供了一个规范化的方式来处理请求和响应。 – Glyph