Сельдерей: можно ли создать задачу из внутренней функции? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть задача с сельдереем:

@task
def foo():
  part1()
  part2()
  part3()

... что я разбиваюсь на цепочку подзадач

@task
def foo():
  @task
  def part1():
    ...

  @task
  def part2():
    ...

  @task
  def part3():
    ...

  chain(part1.s(), part2.s(), part3.s()).delay()

Подзадачи являются внутренними функциями, потому что я не не хочу, чтобы они выполнялись вне контекста родительской задачи. Проблема в том, что мой работник не обнаруживает и / или не регистрирует внутренние задачи (я использую autoregister для обнаружения приложений и модулей задач). Если я перенесу их на тот же уровень в модуле, что и родительская задача foo, она будет работать нормально.

Поддерживает ли сельдерей внутренние функции как задачи? Если да, то как мне заставить работников зарегистрировать их?

1 Ответ

2 голосов
/ 24 февраля 2020

Проблема с вашим кодом в том, что вы получаете новые определения part1 каждый раз, когда звоните foo(). Также обратите внимание, что ни одна функция part1 не создается до тех пор, пока вы не вызовете foo, поэтому для сельдерея невозможно зарегистрировать любую из part функций, которые будут созданы при инициализации рабочего.

I думаю, что следующий код является наиболее близким к тому, что вы хотите.

def make_maintask():
    @task
    def subtask1():
        print("do subtask")

    # ...

    @task
    def _maintask():
        chain(subtask1.si(), subtask2.si(), subtask3.si()).delay()

    return _maintask


maintask = make_maintask()

Таким образом, каждое определение subtask и тому подобное не видно снаружи.

некоторые комментарии

  • Если все, что вы хотите чтобы скрыть subtask, пожалуйста, подумайте дважды. Дизайнер языка python не верил, что нужен контроль доступа, такой как publi c и private, как в java. Это функциональность, которая сильно усложняет язык с сомнительным преимуществом. Я думаю, что хорошо организованные пакеты и модули и хорошие имена (такие как добавление подчеркивания впереди) могут решить все ваши проблемы.

  • Если все, что делает _maintask, это делегирование подзадач другим подпроцессам, Вам действительно не нужно определять это как задачу сельдерея. Не заставляйте задачу сельдерея вызвать другую задачу сельдерея, если она вам действительно не нужна.

...