我通过django-celery运行一些任务(使用rabbitmq作为后端),这些任务非常耗时且CPU密集。
我有两个工作者Ec2实例(一个是小的,另一个是高cpu介质)。
我已经将小实例设置为运行1个并发任务,并将介质设置为4.这对我来说效果很好。但有时候,在芹菜监视器中,我看到小实例正在处理任务,另外2或3个任务处于“RECEIVED”状态(分配给小实例),而媒体实例没有做任何事情。理想情况下,id就像中型实例一样优先于小型,但在这种情况下,如果小型是并发的,则任务应该转到介质。看起来这个小实例咬的次数超过它可以咀嚼的......就像在分配任务时一样,它现在无法开始。
有没有办法让工人只接受当时可以开始的任务?
屏幕截图:http://dl.dropbox.com/u/361747/task-state.png。以domU开头的工人很小,以ip开头的人是中等的。
答案 0 :(得分:1)
您可以使用CELERYD_PREFETCH_MULTIPLIER选项来控制要预取的任务数。在您的情况下,CELERYD_PREFETCH_MULTIPLIER = 1将有助于均匀分配任务。
http://ask.github.com/celery/configuration.html#celeryd-prefetch-multiplier