2016-09-16 3 views

ответ

4

Просто установите CELERY_ALWAYS_EAGER настроек в true, это заставит сельдерей не ставить в очередь задачи и запускать их синхронно в текущем процессе.

Если вы хотите быть в состоянии сделать это на конкретной задаче, вы можете запустить их с применить() или Run(), как вы упомянули, вместо того, чтобы запускать их с apply_async() или задержки().

Так Т.Л., д-р:

CELERY_ALWAYS_EAGER = True 
# The following two would do and act the same, processing synchronously 
my_task.run() 
my_task.delay() 

Но

CELERY_ALWAYS_EAGER = False 
# These two won't be the same anymore. 
my_task.run() # Runs synchronously 
my_task.delay() # Passed to the queue and runs Asynchronously, in another process 
0

Если я правильно понимаю вас, вы хотите вызвать задачу синхронно.

Просто вызовите метод, как обычно:

TaskName() 

Вам только нужно использовать delay, когда вы хотите, чтобы отправить его работнику.

+0

нормально, но как вы получите возвращаемое значение? это все еще обернуто чем-то другим с помощью сельдерея. – kentor

+1

Нет. Вы все равно можете всегда вызывать метод, назначенный как задачу, так как вы вызываете любой другой метод в python. Сельдерей просто добавляет вызов в очередь, которую может выполнить внешний процесс. Если вам нужно вызвать эту задачу как внутри, так и снаружи сельдерея (и снаружи, я имею в виду синхронно в ходе выполнения сценария без опроса для ответа или чего-то подобного или с использованием любого из асинхронных инструментов), тогда просто назовите его как нормальный. Ничего не нужно. Это еще метод в python, способный возвращать значения и т. Д. –