我正在开发一个分布式处理应用程序,我需要尽可能快。我有一个部署,其中领导者应用程序将 celery 任务写入 redis,并有 N 个监听工作人员来执行该任务。
我对我的流程进行了基准测试,确定 1 个工作人员处理 1 个任务的速度完全符合我的需要。然后,对于实际的分布式处理用例,我需要 x100。因此,我启动了 110 个工作线程来监听队列上的 100 个任务。我原本期望有 100 个工作人员完全并行处理这 100 个任务,但在实践中,我看到一些工作人员从队列中获取多个任务,而其他工作人员不处理任何内容。这违背了我的基准测试的目的,因为我无法让我的应用程序工作人员足够快地处理多个任务 - 我需要完全并行完成此操作。
我在一个组中执行我的任务,最终除了我通过预取乘数和 ack_late 设置发现的覆盖(见下文)之外,配置实际上都是默认的:
app.conf.update(
worker_prefetch_multiplier=1,
task_acks_late=True
)
我还可以设置其他内容,以便所有并行工作人员同时执行 1 个任务,并且 100 个任务的总处理时间大约是 1 个任务的基准时间(基本上在方差范围内)?
感谢您的任何见解/帮助!
我已经尝试了大量的芹菜配置设置,但正在努力寻找完美的组合
您是否尝试过使用单独池来运行所有工作人员
celery --app=worker.app worker --pool=solo
这确保一个工作人员一次处理一项任务。 还请提供更多详细信息以更好地帮助您