我有一个Django应用程序,有时需要执行数百万个API请求。为了使其更快,我正在使用Celery发送请求并等待响应,然后再使用它们。
我曾尝试使用Redis作为经纪人和后端来设置Celery:
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
这给了我一个错误:BacklogLimitExceeded:54c6d0ce-318d-461b-b942-5edcd258b5f1
然后我更改为RabbitMQ代理和RPC后端:
CELERY_BROKER_URL = 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'rpc://'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
相同错误
我的API调用代码非常经典:
我有一个urls_chunks = [[url1, url2....url1000], [url1, url2....url1000]]
的列表
由于API速率限制为每分钟1000(在每个呼叫组结束时我都睡1分钟),因此需要这样做
for urls in urls_chunks:
returned_data = []
for url in urls:
result = call_api.delay(url)
returned_data.append(result)
for response in returned_data:
result = response.result
## Do something with the result
sleep(60)
我认为所有的url调用/响应都被缓存在某个地方并且超出了内存范围?但我认为RPC不会发生这种情况。我考虑过使用purge(),但由于RPC不支持,因此也不起作用。
有人知道如何处理吗?我目前正在MacOS上的开发环境中运行,打算部署到Ubuntu。
谢谢!