Tornado异步从dict / list中的URL并行调用

时间:2016-12-16 18:20:23

标签: asynchronous tornado

我有一个URL列表,希望在Python Tornado中以并行方式异步调用。目前,我就是这样做的:

    response_location = yield dict(origin_maxmind=http_client.fetch(origin_urls['maxmind'], raise_error=False),
                                   origin_ipinfo=http_client.fetch(origin_urls['ipinfo'], raise_error=False),
                                   origin_freegeoip=http_client.fetch(origin_urls['freegeoip'], raise_error=False),
                                   arrival_maxmind=http_client.fetch(arrival_urls['maxmind'], raise_error=False),
                                   arrival_ipinfo=http_client.fetch(arrival_urls['ipinfo'], raise_error=False),
                                   arrival_freegeoip=http_client.fetch(arrival_urls['freegeoip'], raise_error=False))

在接下来的路上,我可能想添加新的网址,与已经存在的网址一起调用。我认为如果网址位于dict,这可能会更容易。然后,龙卷风将异步并行调用dict中的所有URL。如果有人想要添加新的URL来调用,我试图避免更改很多东西。如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

如果网址在一个字典中,那么用词典理解就可以直接做到这一点。要获取origin_urls中的所有网址,请执行

response_location = yield {name: http_client.fetch(url, raise_error=False) 
        for (name, url) in origin_urls.items()}

有两个网址,它有点笨拙。以下是您问题中代码的等效内容:

response_location = yield dict(
    [('origin_' + name, http_client.fetch(url, raise_error=False))
         for (name, url) in origin_urls.items()] +
    [('arrival_' + name, http_client.fetch(url, raise_error=False))
         for (name, url) in arrival_urls.items()])