Python 我需要向facebook Graph API发出大约3000个API请求,以收集洞察数据。Facebook对其API调用设置了速率限制

Python 我需要向facebook Graph API发出大约3000个API请求,以收集洞察数据。Facebook对其API调用设置了速率限制,python,facebook,facebook-graph-api,python-multiprocessing,Python,Facebook,Facebook Graph Api,Python Multiprocessing,我需要向Facebook Graph API发出大约3000个API请求,以收集洞察数据。Facebook对其API调用设置了速率限制。我目前正在使用python的多处理模块,并将请求分组到每个50个请求的池中。 在成功处理某些请求后发送请求时,我收到连接错误 requests.exceptions.ConnectionError:(“连接已中止”。,ConnectionResetError(10054,“远程主机强制关闭了现有连接”,无,10054,无)) 我正在使用有效期为2个月的访问令牌。

我需要向Facebook Graph API发出大约3000个API请求,以收集洞察数据。Facebook对其API调用设置了速率限制。我目前正在使用python的多处理模块,并将请求分组到每个50个请求的池中。 在成功处理某些请求后发送请求时,我收到连接错误

requests.exceptions.ConnectionError:(“连接已中止”。,ConnectionResetError(10054,“远程主机强制关闭了现有连接”,无,10054,无))


我正在使用有效期为2个月的访问令牌。有没有办法在不被facebook拒绝的情况下拨打3000个电话。

我建议您听听上面列出的建议。随着时间的推移分散你的请求,确保你没有提出不必要的请求。memcached的本地实例非常适合应用程序级缓存,如果可以利用HTTP缓存,则可以在docker容器中运行varnishd

我已经解决了类似的问题,让应用程序通过停止发送请求一段时间来响应速率限制响应。一旦达到速率限制,请暂停一段时间,然后发送一个请求。如果请求成功,开始以较低的速率发送请求,并缓慢增加请求速率。如果单个请求仍受速率限制,则在重试之前暂停稍长时间


这本质上是一个调度问题,而不是并发问题。您的应用程序变得稍微复杂一些,因为您需要能够控制请求的速率。我会考虑使用请求和响应队列,并控制工人是否主动发送请求。当其中一个工作进程达到速率限制时,清除“发送”事件并设置一个单独的事件,该事件将触发一个单独的子进程来处理来自队列的请求,并执行“暂停并请求”循环,直到不再受速率限制。然后您可以翻转“发送”事件,该事件将释放工作进程以运行。

3000!听起来你不太可能真的需要打这么多电话。答案几乎肯定是找到一种方法来做你想做的事情,减少对API的调用。如果您一次又一次地获取相同的数据,您可能需要考虑将响应缓存一段时间。
#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)