web-dev-qa-db-ja.com

Celery 4がWindowsのサポートをやめた今、Windowsで(Python 3)タスクキューに最適なオプションは何ですか?

Flask site under IIS on Windows)を実行し、アウトプロセスタスクにはCeleryを使用します。CeleryはWindowsでいくつかの問題を引き起こしましたが、今のところ、バージョン3.1.12を実行し、RabbitMQ/AMQPをバックエンドとして使用してWindowsで動作することに満足しています。

Celery(4)の新しいバージョンには Windowsのサポートが削除されました があるため、実行可能な代替手段を探しています。

RQは非常に良いタスクキューのようですが、Windowsもサポートしていません( ページの下部)

次のように、あまり人気のないタスクキューをいくつか見ました。

しかし、これらがWindowsとFlaskをサポートしているかどうかは不明です。 WindowsでPythonタスクキューが機能することを経験した経験があるかどうか疑問に思います。おそらく、私が言及したものの1つか、それとも別の方法です。

Linuxを管理する経験がないため、Linuxマシンを実行することはできません。また、Windowsを必要とする多くのレガシー機能を実行しています。

19
Erik Oosterwaal

私はFlask問題なくWindowsでHueyを使用して、確かに開発とテストのためにのみ実行します。本番環境では、LinuxサーバーでFlask/Hueyを使用します。両方ともRedisバックエンドでFlask 0.12およびHuey 1.2.0。

ファクトリパターンを使用して、Flaskアプリの特別な「カットダウン」バージョンを作成し、Hueyタスクで特定の用途に使用します。このバージョンではブループリントが読み込まれないか、Flask-Adminが構成されていないため、 Hueyタスクでは必須です。

アプリフォルダー内の___init__.py_のコード例。 AppFlaskから拡張されたクラスです:

_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 を調べて、これがどのように実装されているかを確認してください。このプロジェクトでも、Celeryタスクキューで使用する特定のアプリ(_create_celery_app_)を作成する方法に注意してください。

_tasks.py_の例。 Flaskコンテキストを作成するための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)
_
11
pjcunningham