2017-02-20 6 views
10

Мы запускаем сайт Flask под IIS на Windows, а для задач вне процесса мы используем Celery. Celery дал нам некоторые проблемы под Windows, но на данный момент мы довольны работающей версией 3.1.12, используя RabbitMQ/AMQP в качестве back-end, который работает под Windows.Каков наилучший вариант для очереди задач (Python 3) в Windows теперь, когда Celery 4 отказался от поддержки Windows?

Новая версия сельдерея (4) имеет dropped support for Windows, поэтому я ищу жизнеспособную альтернативу.

RQ кажется очень хороший очереди задач, но она также не поддерживает ОС Windows (bottom of the page)

Я видел несколько больше, казалось бы, менее популярные очереди задач, таких как:

Но неясно, поддерживают ли они Windows и Flask. Мне интересно, есть ли у кого-нибудь опыт запуска очереди задач Python под Windows, которая работает. Может быть, один из тех, что я упомянул, или альтернатива.

Это не вариант для запуска Linux-машины, потому что у нас нет опыта администрирования Linux, и у нас много запущенных приложений, требующих Windows.

+0

Вы когда-нибудь находили его? Я искал один за последние 2 недели и не могу найти тот, который все еще развит. –

+0

@KevinVasko; Huey - это тот, который используется наиболее широко. Я экспериментировал с ним, и он прост и работает. Однако я нашел одну большую проблему, и автор тоже не мог мне помочь; Я не могу использовать рабочих Huey, которым нужен контекст Flask. Я не могу понять, как передать задачи в этом контексте. Это останавливает меня в настоящее время с помощью Huey. –

+0

Спасибо за замечание, я проведу Huey, мне не нужно работать с Flask, надеюсь, это не проблема.Я также нашел один, называемый «WorQ», но он не обновлялся через 3 года или около того, и неясно, поддерживает ли он Windows или нет. –

ответ

6

Я запускаю Flask с Huey на Windows без каких-либо проблем, по общему признанию, только для разработки и тестирования. Для производства я использую Flask/Huey на серверах Linux. Как с фокусом Redis, Flask 0.12 и Huey 1.2.0.

Я использую шаблон фабрики для создания специализированной «вырезанной» версии флеш-приложения для конкретного использования задачами Huey. Эта версия не загружает чертежи или не настраивает Flask-Admin, поскольку они не требуются в задачах Huey.

Пример кода __init__.py в папке приложения. App класс простирается от Flask:

def create_app(settings_override=None): 

    app = App('app') 

    if settings_override: 
     app.config.from_object(settings_override) 
    else: 
     app.config.from_object(os.environ['APP_SETTINGS']) 

    from .ext import configure_extensions 
    configure_extensions(app, admin, load_modules=True) 

    # REST 
    import rest.api_v1 
    app.register_blueprint(api_v1_bp, url_prefix='/api/v1') 

    # ... and more suff 


def create_huey_app(): 
    app = App('huey app') 

    app.config.from_object(os.environ['APP_SETTINGS']) 

    from .ext import configure_extensions 
    configure_extensions(app, admin=None, load_modules=False) 

    return app 

Идея configure_extensions берется из Quokka CMS. Изучите его app__init__.py и его extensions module, чтобы узнать, как это реализовано. Обратите также внимание на то, как этот проект также создает конкретное приложение (create_celery_app) для использования с целевой задачей Celery.

Пример tasks.py. Обратите внимание на использование with app.app_context(): для создания контекста фляги. Теперь мои функции имеют доступ к расширениям, таким как Flask-Mail, Flask-SqlAlchemy (db, models) и т. Д.

@huey.task() 
def generate_transaction_documents_and_email(transaction_id): 
    app = create_huey_app() 
    with app.app_context(): 
     reports.generate_transaction_documents_and_email(transaction_id) 


@huey.task() 
def send_email(subject, recipients, text_body, html_body, attachments=[], cc=[]): 
    app = create_huey_app() 
    with app.app_context(): 
     emails.send_email(subject, recipients, text_body, html_body, attachments, cc) 


@huey.periodic_task(crontab(minute='30')) 
def synchronize_mailing_list(): 
    app = create_huey_app() 
    if app.config['CREATESEND_SYNCHRONIZE']: 
     _list_name = app.config['CREATESEND_LIST'] 
     with app.app_context(): 
      sync_delete_ar_subscribers(_list_name) 
      sync_add_ar_subscribers(_list_name) 
+0

Благодарим вас за эту информацию; Я постараюсь сделать это для себя и вернуться к этому вопросу позже. –

+0

Я реализую это, но я не уверен, что вы делаете внутри импорта configure_extensions. Не могли бы вы поделиться тем, что там происходит? –

+0

@RicoSuave Я обновил свой ответ. – pjcunningham