在其他任务中创建的Celery计划任务不会立即进入经纪人

时间:2016-08-26 07:20:34

标签: python multithreading celery celerybeat preforking

我的芹菜任务设置如下:

@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经纪人中没有“未被承认”。

我应该怎样做才能立即将这些辅助任务转到经纪人,而不会给一个工人带来所有任务的负担?

0 个答案:

没有答案