【问题标题】:Python tornado parallel requests using coroutines and handling exceptions使用协程和处理异常的 Python 龙卷风并行请求
【发布时间】:2015-09-18 16:39:32
【问题描述】:

我最近开始使用 python tornado。

我已经使用回调完成了一个小项目,现在 我试图弄清楚如何使用协程 让我的生活更轻松(或更艰难)

我有以下代码:

from tornado import gen

import random
import time

class App(object):

    @gen.coroutine
    def get_repo_issues(self, repo):
        sleep_time = random.randint(1, 5)
        time.sleep(sleep_time)

        if sleep_time in (2, 4):
            raise Exception('There is a disturbance in the force... %d' % sleep_time)

        raise gen.Return(sleep_time)


    @gen.coroutine
    def get_all_repo_issues(self, repo_list):

        for i in repo_list:
            repo = 'repo_' + str(i)
            try:
                items = yield self.get_repo_issues(repo)
                print 'Got %d items for %s' % (items, repo)
            except Exception as e:
                print 'Got exception for %s: %s' % (repo, str(e))


    @gen.coroutine
    def main(self):
        yield gen.Task(self.get_all_repo_issues, range(5))


def main():
    App().main()

以上代码按预期工作,但我希望在捕获和处理异常的同时并行调用 self.get_repo_issues。

我在想一些类似于生成调用字典的方法,但不知道如何捕获异常。

有没有办法在龙卷风中做到这一点?

【问题讨论】:

    标签: python asynchronous exception-handling tornado coroutine


    【解决方案1】:

    禁止在 Tornado 应用程序中调用 sleep。 Tornado 应用程序通常是单线程的,因此sleep 会阻塞整个进程,并且在sleep 执行时不能运行其他协程或回调。改为使用yield gen.sleep(n_seconds) 进行测试。

    要等待许多操作,使用WaitIterator

    futures = {}
    for i in repo_list:
        repo = 'repo_' + str(i)
        futures[repo] = self.get_repo_issues(repo)
    
    wait_iterator = gen.WaitIterator(**futures)
    while not wait_iterator.done():
        try:
            items = yield wait_iterator.next()
        except Exception as e:
            print 'Got exception for %s: %s' % (
                wait_iterator.current_index, str(e))
        else:
            repo = wait_iterator.current_index
            print 'Got %d items for %s' % (items, repo)
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      相关资源
      最近更新 更多