在其他任务中创建的Cerrey计划任务不会立即转到代理

2024-04-18 14:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我的芹菜任务设置如下:

@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和-of air参数运行。我正在使用redis broker与celeri_ACKS_LATE=True一起使用

现在,我从celery beat计划调用heavy_task(1,2).delay(),任务将分配给任何1个工人,然后它创建的10000个任务只与该工人驻留在一起,而不会发布给代理,以便其他工人可以处理这些任务。工作者的预取数继续增加到10000

只有在原始worker中的内存开始消耗接近90%之后,这些任务才会发布到代理,从而转移到其他工作线程。有时工人也会被操作系统杀死,所以我的任务永远丢失,因为它们在redis代理中没有“未确认”。在

我该怎么做才能使这些次要任务立即交给代理,而不必为所有任务增加一个工作人员的负担?在


Tags: inredis代理fortaskreturndefrange