Запустите celery worker и celery beat как поток

Я использую сельдерей для выполнения некоторых задач, запускаемых по времени. Используя обычные методы командной строки, я легко могу генерировать задачи и выполнять их. Для этого мне нужно создать два демона, один для celery beat и другой для celery worker.

Теперь, хотя сельдерей действительно решает мою проблему создания и выполнения задач, запускаемых по времени, но это достигается за счет двух дополнительных демонов для моей системы. У меня уже есть демон, работающий для моего модуля, и я хочу использовать его повторно (добавить celery worker и бить как поток в существующий модуль). Есть ли способ сделать это?


person user3185902    schedule 23.05.2016    source источник


Ответы (1)


Вы можете использовать app.worker_main() для запуска рабочего как потока.

Поскольку вы смогли запустить его из командной строки, я предполагаю, что вы уже построили объект для класса Celery (обычно обозначаемого как app в документации). Вы можете попробовать следующий код, чтобы запустить работника как поток.

from celeryconfig import app # config file you must have build earlier where app = Celery(), object of Celery class

def worker():
    # Arguments you give on command line
    argv = [
        'worker','-A','<module>.tasks',
        '-P','gevent',     # Would probably need this argument if running with other Greenlets
        '--loglevel=info']
    app.worker_main(argv)

Просто создайте поток для вышеуказанного метода в файле main.py модуля.

Для удара сельдерея я ранее пытался сам создать аналогичный метод. (Не уверен, что уже существует метод). Я написал следующий метод и добавил его в класс Celery.

def beat_main(self, argv=None):
    return instantiate(
        'celery.bin.beat:beat',
        app=self).execute_from_commandline(argv)

Ваш класс Celery написан на /usr/local/lib/python2.7/dist-packages/celery/app/base.py. Попробуйте использовать его так же, как рабочий (app.beat_main с аргументами). Надеюсь, это сработает и для вас.

person akipro    schedule 23.05.2016