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

Tornado async calls in parallel from URLs in dict/list

我有一个 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))

再往前走,我可能想添加新的 URL 来与已经存在的那些一起调用。我认为如果 URL 位于 dict 中,这可能会更容易。然后 Tornado 将异步并行调用 dict 中的所有 URL。如果有人想添加一个新的 URL 来调用,我会尽量避免更改很多东西。如何实现?

如果 url 在一个字典中,则可以直接使用字典理解来执行此操作。要获取 origin_urls 中的所有网址,请执行

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

有两个 url 字典,有点笨拙。这是您问题中的等效代码:

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()])