2016-12-16 5 views
0

Python Tornadoでparrallelで非同期に呼び出すURLのリストがあります。現在のところ、これは私がそれについて移動する方法です:dict/listのURLから並行してTornado Asyncを呼び出す

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の場合は、これがより簡単になると思います。その後、竜巻は、その中のすべてのURLを非同期にパラレルに呼び出します。dict誰かが新しいURLを追加して電話をかけたいと思ったら、たくさんのことを変える必要がないようにしようとしています。これはどのように達成できますか?

答えて

0

URLが1つの辞書にある場合は、辞書の理解でこれを行うのが簡単です。 origin_urls内のすべてのURLを取得するには、URLの2枚のdictsで

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

を行い、それは少しclumsierです。あなたの質問に相当するコードは次のとおりです。

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()]) 
関連する問題