2015-05-26 167 views
3

以下是我正在運行的代碼片段,它使用多處理並行地觸發HTTP請求。在控制檯上運行後,它將掛起「requests.get(url)」,既不繼續也不拋出錯誤。Python:多處理和請求

def echo_100(q): 
    ... 
    print "before" 
    r = requests.get(url) 
    print "after" 
    ... 
    q.put(r) 

q = multiprocessing.Queue() 
p = multiprocessing.Process(target=echo_100,args=(q)) 
p.start() 
p.join() 
resp = q.get() 
+0

如果按順序執行,'requests.get'是否返回URI? –

+0

您是否正在清理隊列(即從某處發出q.get())? –

+0

requests.get需要第二個參數auth =('user','pass'),你確定你不需要它嗎?此外,函數本身是否也能工作,即requests.get問題還是多處理問題? –

回答

0

如果你不清理隊列,我的意思是不要把物品從隊列中,該過程將在一段時間後掛起。多處理隊列由Linux平臺上未命名的FIFO(管道)支持。管道的最大尺寸限制。這意味着,如果一個進程寫入管道而沒有其他進程正在從管道讀取數據,一段時間後,寫入進程將掛起,同時嘗試將更多數據放入管道(它可能掛在內部的寫入系統調用中)。

我懷疑,您沒有從隊列中獲取項目,因此隊列在一段時間後變滿,導致後續的子進程停滯。

現在,如果子進程掛起,那麼如果父進程試圖加入(p.join())子進程(在內部它將調用waitpid來加入子進程),它也可能掛起。

0

我有一個項目完全相同的問題。我發現在我的所有模塊中刪除import ipdb調用可解決此問題。我不確定爲什麼導入導致這個問題,但消除那些導入完全解決了它。只要單獨導入就會導致問題,我甚至沒有使用ipdb軟件包中的任何東西。

UPDATE:這發生在兩個Python的2.7.10和3.5.0,只有當我輸入ipdb;如果您導入pdb,一切正常。我已經發布了一個相關的問題,問爲什麼會發生這種情況here

希望這可以解決您的問題。

2

在Mac OS上,從操作系統讀取代理設置似乎存在一些錯誤。我不知道確切的細節,但有時會導致請求在使用多處理時掛起。你可以嘗試通過完全禁用操作系統代理來繞過這個問題,像這樣:

session = requests.Session() 
session.trust_env = False # Don't read proxy settings from OS 
r = session.get(url) 

爲我修好了。