Flask Сельдерей: тип синхронизации событий - PullRequest
0 голосов
/ 03 августа 2020

У меня довольно уникальное поведение, которого мне нужно добиться с сельдереем. Я понимаю, что блокировать задачи вообще не рекомендуется, но я считаю, что это необходимо, как я описываю ниже. Псевдокод:

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 для запуска задач входа в группу и запустить другую группу после выполнения условия для выполнения задач действия. Однако веб-действие чувствительно ко времени, и я не хочу повторно открывать новый экземпляр селена (что, в первую очередь, нарушило бы цель наличия этой структуры).

Я видел примеры например: Flask Блокировка задачи Celery , но использование кеша Redis для этого приложения кажется ненужным (и это не обязательно должно быть atomi c, потому что «блокировка» изменяется только с помощью task1). Я также изучил пульт дистанционного управления Celery , но я не уверен, есть ли возможность блокировать, пока не будет получен сигнал.

Есть аналогичный вопрос здесь , который был решен путем разделения задачи, которую я хочу заблокировать, на 2 отдельные задачи, но я снова не могу этого сделать.

1 Ответ

1 голос
/ 03 августа 2020

Задачи Celery могут сами ставить задачи в очередь, поэтому можно дождаться события вроде «9 утра», а затем запустить кучу параллельных задач. Если вам нужно запустить дополнительную задачу по завершении группы параллельных задач (например, если вам нужна задача разветвления при завершении всех задач разветвления), вам нужен механизм аккорды .

...