首页 > 解决方案 > Flask Celery:事件同步类型

问题描述

我有非常独特的行为,我需要用芹菜来实现。我知道完全不建议阻止任务,但是我认为这里有必要,如下所述。伪代码:

Task 1:
Set event to false
Start group of task 2
Scrape website every few seconds to check for changes
If changes found, set event

Task 2:
Log into website with selenium.
Block until event from Task 1 is set
Perform website action with selenium

我希望 task2 为多个用户并行执行多次。因此,在 task2 的每个实例中检查网站的更新将导致对网站的大量请求,这是不可接受的。

对于这样的正常流程,我会使用 task1 在一个组中启动登录任务,并在满足条件后启动另一个组以执行操作任务。但是,web 操作是时间敏感的,我不想重新打开一个新的 selenium 实例(这会破坏首先拥有这个结构的目的)。

我见过这样的例子:Flask Celery tasklocking but using a Redis cache 对于这个应用程序来说似乎是不必要的(它不需要是原子的,因为“锁”只被task1修改)。我还研究了Celery 的遥控器,但我不确定是否有能力阻止直到收到信号。

这里有一个类似的问题,通过将我想要阻止的任务分成 2 个单独的任务来解决,但我又不能这样做。

标签: pythonpython-3.xflaskcelerycelery-task

解决方案


Celery 任务本身可以将任务排入队列,因此可以等待像“早上 9 点”这样的事件,然后产生一堆并行任务。如果您需要在完成一组并行任务时启动附加任务(即,如果您需要在完成所有扇出任务时执行扇入任务),您想要的机制是chords


推荐阅读