0

我需要向Facebook Graph API發送大約3000條API請求以收集洞察數據。 Facebook爲其API調用設置了速率限制。我目前正在使用python的多處理模塊,並將請求分組爲50個請求池。 我在發送請求成功處理一些請求後發生連接錯誤。我需要製作大約3000個API請求才能收集洞察數據。 Facebook爲其API調用設置了速率限制

requests.exceptions.ConnectionError:( '連接異常中止',ConnectionResetError(10054, '一個現有的連接被強行關閉遠程主機',無,10054,無))

#my multiprocessing pools 
pool= mp.Pool(processes = len(s)) 
    results= [ pool.apply_async(get_data, args=(url,)) for url in s] 
    data = [p.get() for p in results] 

#get data function to send requests 
def get_data(url): 
    data = requests.get(url,params=parameters).json() 
    return(data) 

我使用有效期爲2個月的訪問令牌。如果連接被Facebook拒絕,是否有任何方法可以進行3000次通話。

+0

3000!這聽起來不太可能真的需要打這麼多電話。答案几乎肯定會是找到一種方法,以更少的API調用來滿足自己的需求。如果您一遍又一遍地讀取相同的數據,您可能需要考慮緩存響應一段時間。 –

+0

https://developers.facebook.com/docs/graph-api/advanced/rate-limiting – CBroe

回答

0

我推薦聽聽Facebook's Rate Limiting page上列出的建議。隨着時間的推移傳播你的請求,並確保你沒有提出不必要的請求。如果可以利用HTTP緩存,則memcached的本地實例非常適合應用程序級緩存或在docker容器中運行varnishd。

我已經通過停止發送一段時間的請求來響應速率限制響應,從而解決了類似的問題。一旦達到費率限制,暫停一段時間,然後發送一個請求。如果請求成功,則開始以低速率發送請求並緩慢提高請求速率。如果單個請求仍然受到速率限制,則再試一次後再暫停一會兒。

這本質上是一個調度問題,而不是一個併發問題。您的應用程序變得稍微複雜一些,因爲您需要能夠控制請求的速率。我會考慮使用multiprocessing.Queue請求&響應隊列和multiprocessing.Event來控制工作人員是否正在主動發送請求。當其中一名工人遇到速率限制時,清除「發送」事件並設置一個單獨的事件,該事件將觸發單獨的子流程來處理來自隊列的請求並執行「暫停和請求」循環,直到您不再處於價格有限。然後你可以翻轉「發送」事件,這將釋放工人運行。