我的芹菜任务设置如下:
@celeryapp.task
def heavy_task(x, y):
# some stuff
for _ in range(10000):
heavy_task_2.apply_async(args=(x,y),
countdown=random.randint(60,120))
return x+y
@celeryapp.task
def heavy_task_2(x, y):
# some stuff
return x+y
我有5个工人(prefork),每个工作30个并发。全部使用prefetch_multiplier = 1和-Ofair参数运行。我正在使用带有CELERY_ACKS_LATE = True的redis代理
现在,我从芹菜节拍计划中调用heavy_task(1,2).delay(),任务转到任何1个工作人员,然后它创建的所有10,000个任务仅驻留在该工作者身上,而不是发布给经纪人,以便其他工人可以完成这些任务。 worker的prefetch_count继续增加到10,000
只有在原始工作程序中的内存开始消耗接近90%之后,这些任务才会发布到代理,从而转移到其他工作程序。有时候工作人员也会被操作系统杀死,所以我的任务永远丢失,因为他们在redis经纪人中没有“未被承认”。
我应该怎样做才能立即将这些辅助任务转到经纪人,而不会给一个工人带来所有任务的负担?