Основная проблема — представление. Если я пишу рабочие процессы как обычные функции Python, я не могу возобновить работу в середине функции. Если я моделирую все как гигантский автомат с перечислениями и if/ while, оно быстро становится нечитабельным после ветвления и повторных попыток.
Вот примерно то, что я имею в виду под тем, что я хочу, но не могу безопасно возобновить:
Код: Выделить всё
def workflow(ctx):
user = fetch_user(ctx.user_id)
if user.is_premium:
charge(user)
else:
enqueue_trial_email(user)
result = call_external_api(user)
persist_result(result)
Я экспериментировал с сохранением указателя current_step и аргументов:
Код: Выделить всё
def step_charge(ctx):
charge(ctx.user)
def step_email(ctx):
enqueue_trial_email(ctx.user)
Какой шаблон на самом деле работает в Python? Рассматриваете ли вы рабочие процессы как журналы шагов, доступные только для добавления, и воспроизводите ли вы их? Сохранить как указатель шага, так и историю выполнения? Структурировать каждый шаг как команду с явными входами/выходами и полагаться на ключи идемпотентности + транзакции БД? Есть ли чистый способ выразить ветвление и циклирование без создания огромного ручного конечного автомата?
Я ищу прагматичную архитектуру, которую можно отлаживать и воспроизводить по мере роста числа рабочих процессов и режимов сбоя, а не теоретический ответ, если нет конкретной причины.
Подробнее здесь: https://stackoverflow.com/questions/798 ... t-a-full-w
Мобильная версия