2015-06-26 94 views
-1

我正在編寫一個API端點,您可以認爲它是其他API的聚合器。你發送它的某些參數,它所做的是將這些參數轉換爲底層API的參數並進行調用。現在理想情況下,我不想以串行方式進行這些調用。Python - 獲取多個URL

這樣做的最好方法是什麼?

編輯:正如我懷疑,線程或進程不是要走的時候,你想要做的事情是獲取網址。這是因爲大部分時間都花在等待網絡回覆上,所以你真正想要的是改變管理正在等待實際執行請求的任務的任務之間的變化。因此,我認爲類似問題的答案實際上是不好的答案。

+0

你可以在這個其他SO問題中找到它:http://stackoverflow.com/questions/983144/how-to-do-a-non-blocking-url-fetch-in-python。請在您提問之前嘗試搜索您的問題。 – logc

+0

我不確定產生全新的進程或線程是解決這個問題的方法。此外,答案是從2009年開始。請嘗試考慮您的意見。 – oneloop

+0

我並不打算冒犯你。爲了避免對基本相同的問題有許多(接受的)答案,標記重複項是標準的SO策略。否則,如果你想排除一些併發模型,比如線程和多處理,你應該在你的問題中說明這個約束。這將迫使你[使用Python 3](https://docs.python.org/3/library/asyncio.html)或[安裝具有系統依賴關係的非平凡庫](http://gevent.org);儘管如此,2009年的答案在2015年仍然是完全有效的。再一次,如果我看起來很粗魯,我很抱歉。 – logc

回答

0

經過一番研究,據我可以告訴單線程異步代碼比獲得多個URL,並且尤其是對許多許多的URL的情況下的特定情況下的線程更好的答案:

有扭曲,框架: http://twistedmatrix.com/documents/14.0.1/web/howto/client.html

而且GEVENT,庫:從http://mauveweb.co.uk/posts/2014/07/gevent-asynchronous-io-made-easy.html http://sdiehl.github.io/gevent-tutorial/

簡單的例子,用做20的池100個電話:

from gevent import monkey 
monkey.patch_all() 

import urllib2 
from gevent.pool import Pool 


def download(url): 
    return urllib2.urlopen(url).read() 


if __name__ == '__main__': 
    urls = ['http://httpbin.org/get'] * 100 
    pool = Pool(20) 
    print pool.map(download, urls)