Скажем, у меня есть Процесс, в котором есть две необязательные задачи View до конца:
--> Split --> optional_view_1 ---> Join ----> finish
| ^
| |
-----> optional_view_2 -------
Допустим, обе задачи назначены, но человек входит в систему и завершает option_view_1.Само соединение и, действительно, конечный узел имеют статус DONE.Тем не менее, процесс застревает и НЕ завершается чисто из-за option_view_2.
Вопросы:
- как завершить процесс чисто (т.е. не отменять его) и без гонок
- откуда (например, из соединения илиОбработчик после каждого просмотра отменяет другой?)
Первоначально я опубликовал это как проблему вместе с возможным кодированным решением.Таким образом, код:
- Переопределяет активацию "выполнено", связанную с объединением
- Переопределение проверяет, имеет ли объединение wait_all = False
- И если так,пытается найти любые другие задачи, которые объединение ожидает
- и отменяет их
Код для шага 3 - это бит, который меня больше всего беспокоит.Это модифицированная версия кода Viewflow , обрабатывающая регистр wait_all = True , и выглядит примерно так:
previous = self.task.previous.exclude(status=STATUS.CANCELED).all()
join_prefixes = set(prev.token.get_common_split_prefix(self.task.token, prev.pk)
for prev in previous)
#
# Don't forget to exclude the previous tasks.
#
join_token_prefix = next(iter(join_prefixes))
active = self.flow_class.task_class._default_manager \
.filter(process=self.process, token__startswith=join_token_prefix) \
.exclude(status__in=[STATUS.DONE, STATUS.CANCELED], pk__in=[prev.pk for prev in previous])
for task in active:
cancel_task(task)
Любые комментарии о том, правильный ли это подход или нет, будутприветствуется.