我有一个可以同时执行几个任务的协同程序:
@gen.coroutine
def scrape_trackers(self):
yield [self.scrape_tracker(tracker) for tracker in self.torrent.trackers]
有些跟踪器永远不会响应(或者可能在一个小时内响应),所以我的代码永远无法通过这个方法,因为Tornado正在等待所有的全部完成。我如何只等待一个完成,然后在后台继续尝试其他的呢?在
比如:
^{pr2}$我在考虑用IOLoop.add_callback()
调用每个方法,并在它们完成时执行一些操作,但我不完全确定从那里开始应该做什么:
for tracker in self.torrent.trackers:
future = self.scrape_tracker(tracker)
IOLoop.add_future(future, self.tracker_scraped)
感谢任何帮助。在
yieldpoints库有一个}的源代码,以将两者混合。在
WaitAny
函数。不过,它早于龙卷风使用Futures
,所以现在使用它有点麻烦。最好查看yieldpoints.WaitAny
和{或者,可以重新组织代码,使
WaitAny
不再需要。与其一个在完成时剥离结果的协同进程,不如为每个任务启动一个新的协同进程,并在最后将它们全部加入:我能想到的最好方法是返回一个新的
Future
,并让第一个成功的函数调用给出一个结果:相关问题 更多 >
编程相关推荐