Python 芹菜-使用apply_async添加7000个任务需要12秒

Python 芹菜-使用apply_async添加7000个任务需要12秒,python,redis,rabbitmq,celery,eventlet,Python,Redis,Rabbitmq,Celery,Eventlet,我使用芹菜将任务分发到多个服务器。由于某些原因,向队列中添加7000个任务的速度非常慢,而且似乎受到CPU的限制。执行下面的代码需要12秒,这只是将任务添加到队列中 start = time.time() for url in urls: fetch_url.apply_async((url.strip(),), queue='fetch_url_queue') print time.time() - start 在代理之间切换(尝试过redis、RabbitMQ和pyamqp)没有任

我使用芹菜将任务分发到多个服务器。由于某些原因,向队列中添加7000个任务的速度非常慢,而且似乎受到CPU的限制。执行下面的代码需要12秒,这只是将任务添加到队列中

start = time.time()
for url in urls:
    fetch_url.apply_async((url.strip(),), queue='fetch_url_queue')
print time.time() - start
在代理之间切换(尝试过redis、RabbitMQ和pyamqp)没有任何显著效果

减少工人数量(每个工人都在自己的服务器上运行,独立于添加任务的主服务器)没有任何显著效果

传递的URL非常小,每个URL只有大约80个字符


在我的配置中,任意两个给定服务器之间的延迟都是亚毫秒(任务排队的速度取决于您使用的芹菜代理和服务器cpu

使用AMDA4-5000 CPU和4GB ram,以下是各种代理的任务速率

# memory -> 400 tasks/sec
# rabbitmq -> 220 tasks/sec
# postgres -> 30 tasks/sec
使用Intel(R)Xeon(R)CPU E5-2676 v3@2.40GHz和4GB ram

# memory -> 2000 tasks/sec
# rabbitmq -> 1500 tasks/sec
# postgres -> 200 tasks/sec

看起来你是对的。我真的没想到添加7000个任务需要几秒钟,即使是在最好的情况下。你知道我如何调用apply_async()在多线程中,通过添加另一个CPU将时间减半?理想情况下,在python 2.7.1500中,任务/秒可能是最好的情况。这在很大程度上取决于消息的内容,因为RabbitMQ具有批处理(与流相反)单个消息的。这将是一个上限,并且不会因多个生产者异步生成消息而增加。您还必须处理任何问题。@MAC77如果您事先有任务的所有参数,分块是一个不错的选择。这是预期的行为。您有单个工作者还是工作集群运行任务的程序?明白了,所以要同时使用分块和在一个分块内并行任务,我需要创建自己的分块机制(因为使用芹菜的
.chunks()
函数似乎不允许在一个分块内并行任务)?也就是说,我有
获取url.apply\u异步((url,)
现在,我需要将其更改为
fetch\u url.apply\u async([url1,url2,url3],)
然后在
fetch\u url
中,我需要编写自己的代码来并行请求
url1
url2
url3
,并回答您的问题:我有一组工作人员运行任务(每个工作人员都有自己的服务器)。你预计需要多长时间才能添加7000个内容?似乎不太可能期望它是即时的。我绝对不希望它是即时的,但考虑到每个任务传递的数据量很小(一个80个字符的URL),我期待1秒左右的时间。您的队列是如何配置的?它们是否设置为持久的?否,为了提高性能,我让我的队列变为暂时的(设置
持久=False
传递模式=1
)。