Celery 3.1(Cipater)の新機能—Pythonドキュメント

提供:Dev Guides
Celery/docs/latest/history/whatsnew-3.1
移動先:案内検索

Celery 3.1(Cipater)の新機能

著者
ソレムに聞く(ask at celeryproject.org

変更履歴

新しいドキュメントではメジャーバージョンの変更について説明しています。バグ修正リリース(0.0.x)の変更を一覧表示する変更履歴もありますが、古いシリーズは履歴セクションにアーカイブされています。 。

Celeryは、膨大な量のメッセージを処理すると同時に、そのようなシステムを維持するために必要なツールを操作に提供する、シンプルで柔軟性があり、信頼性の高い分散システムです。

これは、リアルタイム処理に重点を置いたタスクキューであり、タスクのスケジューリングもサポートしています。

Celeryには、ユーザーと寄稿者の大規模で多様なコミュニティがあります。IRCまたはメーリングリストでに参加する必要があります。

セロリの詳細については、はじめにをお読みください。

このバージョンは以前のバージョンと下位互換性がありますが、次のセクションを読むことが重要です。

このバージョンは、CPython 2.6、2.7、および3.3で公式にサポートされており、PyPyでもサポートされています。

目次

このバージョンにアップグレードする前に、必ず重要な注意事項をお読みください。


序文

デッドロックは長い間私たちの労働者を悩ませてきました、そして珍しいことではありますが、それらは受け入れられません。 彼らはまた、診断と再現が非常に難しいことで悪名高いので、この仕事を簡単にするために、私はそれを破ろうとしてさまざまなタスクで労働者を攻撃するストレステストスイートを書きました。

毎秒何千ものワーカー子プロセスが強制終了されるとどうなりますか? 10秒ごとにブローカー接続も切断するとどうなりますか? これらは、ストレステストスイートがワーカーに対して行うことの例であり、さまざまな構成の組み合わせを使用してこれらのテストを再実行し、エッジケースのバグを見つけます。

その結果、POSIXセマフォの使用を回避するために、プリフォークプールを書き直す必要がありました。 これは非常に困難でしたが、何ヶ月にもわたるハードワークの後、労働者はついにストレステストスイートに合格しました。

おそらくもっと多くのバグを見つけることができますが、幸いなことに、バグを再現するためのツールが用意されているので、バグを経験するのが不運な場合は、テストを作成して潰します。

また、多くのブローカートランスポートを実験的な状態に移行したことに注意してください。現在、本番環境での使用が推奨されているトランスポートは、RabbitMQとRedisのみです。

それらすべてを維持するためのリソースがないので、バグは未解決のままです。 誰かがステップアップしてこれらのトランスポートの責任を負うか、リソースを寄付してそれらを改善することを望んでいますが、現在の状況では、他のコードベースの品質が最新ではないと思うので、それらをお勧めすることはできません生産用。

Celery 4.0の次のバージョンは、パフォーマンスと、ライブラリのめったに使用されない部分の削除に重点を置いています。 複数の言語などをサポートする新しいメッセージプロトコルの作業も開始されました。 最初のドラフトはここにあります。

これはおそらく私が取り組んだ中で最も難しいリリースだったので、この変更ログの紹介は、私がそれをテストするのを助けてくれたすべての人に大いに感謝することなしには完了しません!

ご支援いただきありがとうございます!

—ソレムに聞く


重要な注意事項

Python2.5のサポートを終了しました

CeleryにはPython2.6以降が必要になりました。

新しいデュアルコードベースは、2to3移植ツールを必要とせずにPython2と3の両方で実行されます。

ノート

これは、Python2.6をサポートする最後のバージョンでもあります。 Celery 4.0以降では、Python2.7以降が必要になります。


デフォルトでPickleを有効にする最後のバージョン

Celery 4.0以降、デフォルトのシリアライザーはjsonになります。

ピクルスが受け入れられることに依存している場合は、:setting: `CELERY_ACCEPT_CONTENT` 設定を使用してワーカーがピクルスメッセージを消費することを明示的に許可することにより、この変更に備える必要があります。

CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']

実際に使用するシリアル化形式のみを選択し、ブローカーを不要なアクセスから適切に保護していることを確認してください(セキュリティガイドを参照)。

この設定を定義しない場合、ワーカーは非推奨の警告を発します。

昆布ユーザー向け

Kombu 3.0はデフォルトでピクルスメッセージを受け入れないため、Kombuを直接使用する場合は、コンシューマーを構成する必要があります。詳細については、 Kombu3.0変更ログを参照してください。


古いコマンドラインプログラムが削除され、非推奨になりました

誰もが新しい celery アンブレラコマンドに移行する必要があるため、古いコマンド名は段階的に廃止されます。

このバージョンでは、init-scriptsで使用されていないすべてのコマンドを削除しました。 残りは4.0で削除されます。

プログラム 新しいステータス 置換
celeryd 非推奨 セロリ労働者
celerybeat 非推奨 セロリビート
celeryd-multi 非推奨 セロリマルチ
celeryctl NS 管理
celeryev NS セロリイベント
camqadm NS セロリamqp

これが新規インストールでない場合は、古いコマンドを削除することをお勧めします。

$ pip uninstall celery
$ # repeat until it fails
# ...
$ pip uninstall celery
$ pip install celery

アンブレラコマンドの使用方法については、 celery --help を実行してください。


ニュース

プレフォークプールの改善

これらの改善は、非同期対応のトランスポートを使用する場合にのみアクティブになります。 つまり、現時点ではRabbitMQ(AMQP)とRedisのみがサポートされており、他のトランスポートは引き続きスレッドベースのフォールバック実装を使用します。

  • プールは現在、子プロセスごとに1つのIPCキューを使用しています。

    以前は、プールはすべての子プロセス間で1つのキューを共有し、POSIXセマフォをミューテックスとして使用して排他的な読み取りおよび書き込みアクセスを実現していました。

    POSIXセマフォが削除され、各子プロセスが専用のキューを取得します。 これは、ワーカーがより多くのファイル記述子(プロセスごとに2つの記述子)を必要とすることを意味しますが、パフォーマンスが向上し、個々の子プロセスに作業を送信できることも意味します。

    プロセスが強制終了されてもPOSIXセマフォは解放されないため、プロセスの強制終了は、セマフォの取得中に発生した場合にデッドロックにつながる可能性があります。 これを修正するための適切な解決策はないため、最良のオプションはセマフォを削除することでした。

  • 非同期書き込み操作

    プールは非同期I / Oを使用して、子プロセスに作業を送信するようになりました。

  • 失われたプロセスの検出が即座に行われます。

    子プロセスが強制終了されたり、不思議なことに終了したりした場合、プールは以前は30秒間待機してから、タスクにWorkerLostErrorのマークを付ける必要がありました。 アウトキューはすべてのプロセス間で共有され、プールはプロセスがタスクを完了したかどうかを確認できなかったため、これを行う必要がありました。 そのため、この時点までにアウトキューが空になっていると考えられていたため、30秒の任意のタイムアウトが選択されました。

    このタイムアウトは不要になったため、プロセスが終了したという通知をプールが受け取るとすぐに、タスクを失敗としてマークできます。

  • まれな競合状態が修正されました

    これらのバグのほとんどは私たちに報告されたことはありませんが、新しいストレステストスイートの実行中に発見されました。

警告

長時間実行されるタスク

新しいプールは、キュー内のプロセスが書き込み可能である限り、子プロセスにタスクを送信します。ソケットはバッファリングされているため、これは、プロセスが事実上、タスクをプリフェッチしていることを意味します。

これはパフォーマンスにメリットがありますが、長時間実行されているタスクが完了するのを待って他のタスクがスタックする可能性があることも意味します。

-> send T1 to Process A
# A executes T1
-> send T2 to Process B
# B executes T2
<- T2 complete

-> send T3 to Process A
# A still executing T1, T3 stuck in local buffer and
# won't start until T1 returns

バッファサイズはオペレーティングシステムによって異なります。バッファのサイズが64KBと小さいものもありますが、最近のLinuxバージョンではバッファサイズは1MBです(システム全体でのみ変更できます)。

-Ofairワーカーオプションを有効にすると、このプリフェッチ動作を無効にできます。

$ celery -A proj worker -l info -Ofair

このオプションを有効にすると、ワーカーは作業に使用できるワーカーにのみ書き込みを行い、プリフェッチ動作を無効にします。


子供1人あたりの最大タスク

プロセスが終了し、プールのプリフェッチが有効になっている場合、ワーカーはすでに多くのタスクをキュー内のプロセスに書き込んでいる可能性があり、これらのタスクを元に戻して新しいプロセスに書き直す必要があります。

--max-tasks-per-childオプションを低い値(たとえば、10未満)に設定している場合、これは非常にコストがかかります。-Ofastスケジューラオプションを使用しないでください。


Djangoはすぐにサポートされます

Celery 3.0は光沢のある新しいAPIを導入しましたが、残念ながらDjangoユーザー向けのソリューションはありませんでした。

Djangoがコアでサポートされるようになり、Celeryにアクセスする新しいDjangoユーザーが新しいAPIを直接使用することが期待されるため、このバージョンでは状況が変わります。

Djangoコミュニティには、ライブラリごとに個別のdjango-xパッケージがあり、Djangoとライブラリの間の架け橋のように機能するという慣習があります。

Djangoユーザー向けに個別のプロジェクトを用意することは、Celeryにとって苦痛であり、複数の問題追跡システムと複数のドキュメントソースがあり、最後に3.0以降はさまざまなAPIも使用していました。

このバージョンでは、コンベンションとDjangoユーザーが他のすべてのユーザーと同じライブラリ、同じAPI、同じドキュメントを使用することに挑戦します。

新しいAPIを使用するために既存のコードを急いで移植する必要はありませんが、それを試してみたい場合は、次のことを知っておく必要があります。

  • Celeryアプリケーションインスタンスを使用する必要があります。

    3.0で導入された新しいCeleryAPIでは、ユーザーはアプリケーションを作成してライブラリをインスタンス化する必要があります。

    from celery import Celery
    
    app = Celery()
  • CeleryをDjangoと明示的に統合する必要があります

    Celeryは自動的にDjango設定を使用しないため、Celeryを個別に構成するか、次の方法でDjango設定を使用するように指示することができます。

    app.config_from_object('django.conf:settings')

    また、インストールされているアプリを自動的にトラバースしてタスクモジュールを見つけることもありません。 この動作が必要な場合は、DjangoインスタンスのリストをCeleryアプリに明示的に渡す必要があります。

    from django.conf import settings
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  • manage.pyは使用しなくなりました

    代わりに、 celery コマンドを直接使用します。

    $ celery -A proj worker -l info

    これを機能させるには、アプリモジュールに DJANGO_SETTINGS_MODULE環境変数を保存する必要があります。 Djangoガイドの例を参照してください。

新しいAPIの使用を開始するには、最初に Celery の最初のステップのチュートリアルを読み、次に Django の最初のステップのDjango固有の手順を読む必要があります。

:pypi: `django-celery` ライブラリによって適用された修正と改善は、 DJANGO_SETTINGS_MODULE環境変数が設定されていることを検出すると、コアCeleryによって自動的に適用されるようになりました。 。

ディストリビューションには、examples/djangoでDjangoを使用した新しいサンプルプロジェクトが付属しています。

https://github.com/celery/celery/tree/3.1/examples/django

一部の機能には、:pypi: `django-celery` ライブラリが必要です。

  • Celeryは、Djangoデータベースまたはキャッシュ結果バックエンドを実装していません。
  • *; Celeryには、データベースベースの定期的なタスクは付属していません
    スケジューラー。


ノート

Celery 3.1にアップグレードするときに古いAPIをまだ使用している場合は、をインポートした場合の副作用として発生しなくなるため、設定モジュールにdjcelery.setup_loader()行が含まれていることを確認する必要があります。 ]:pypi: `django-celery` モジュール。

新しいユーザー(または新しいAPIに移植した場合)は、setup_loader行を必要としなくなったため、必ず削除する必要があります。


イベントは論理時間を使用して順序付けられるようになりました

物理クロックを完全に同期させることは不可能であるため、タイムスタンプを使用して分散システムでイベントを順序付けることは信頼できません。

セロリのイベントメッセージには、しばらくの間論理クロック値が含まれていましたが、このバージョン以降、そのフィールドはメッセージの順序付けにも使用されます。

また、イベントは、イベントメッセージに新しいutcoffsetフィールドを含めることにより、タイムゾーン情報を記録するようになりました。 これは、UTC時間との差を時間単位で示す符号付き整数であるため、たとえば、夏時間でヨーロッパ/ロンドンのタイムゾーンから送信されたイベントのオフセットは1になります。

@events.Receiverは、タイムスタンプをローカルタイムゾーンに自動的に変換します。

ノート

論理クロックは、同じクラスター内の他のノード(ネイバー)と同期されるため、これは、クラスター内の最初のワーカーが開始した時点で論理エポックが開始されることを意味します。

すべてのワーカーがシャットダウンされると、クロック値が失われ、0にリセットされます。 これを防ぐには、celery worker --statedbオプションを指定して、ワーカーがシャットダウン時にクロック値を保持できるようにする必要があります。

論理クロックは整数値であり、非常に急速に増加することに気付くかもしれません。 ただし、最もビジーなクラスターであっても、クロックが64ビット値を超えるまでに数千年かかる場合があるため、値のオーバーフローについて心配する必要はありません。


新しいワーカーノード名の形式(name@host)

ノード名は、「@」で区切られたnameとhost-nameの2つの要素で構成されるようになりました。

この変更は、同じマシンで実行されている複数のインスタンスをより簡単に識別できるようにするために行われました。

カスタム名が指定されていない場合、ワーカーはデフォルトで「celery」という名前を使用するため、完全修飾ノード名は 'celery @ hostname 'になります。

$ celery worker -n example.com
[email protected]

名前も設定するには、@を含める必要があります。

ワーカーは、イベントおよびブロードキャストメッセージで完全修飾ノード名を使用して自分自身を識別します。そのため、ワーカーが自分自身を「worker1.example.com」として識別する前に、'[email protected]を使用するようになります。 '。

-n引数は単純な変数置換もサポートしているため、現在のホスト名が george.example.com の場合、%hマクロは次のように展開されます。

$ celery worker -n worker1@%h
[email protected]

使用可能な代替は次のとおりです。

変数 置換
%h 完全なホスト名(ドメイン名を含む)
%d ドメイン名のみ
%n ホスト名のみ(ドメイン名なし)
%% キャラクター%


バインドされたタスク

タスクデコレータは「バインドされたタスク」を作成できるようになりました。これは、タスクがself引数を受け取ることを意味します。

@app.task(bind=True)
def send_twitter_status(self, oauth, tweet):
    try:
        twitter = Twitter(oauth)
        twitter.update_status(tweet)
    except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
        raise self.retry(exc=exc)

タスクインスタンスまたはリクエストコンテキストにアクセスする必要がある場合は常に、バインドされたタスクを使用することが推奨されるアプローチになりました。 以前は、代わりにタスクの名前(send_twitter_status.retry)を参照する必要がありましたが、これにより、一部の構成で問題が発生する可能性がありました。


混合:ワーカーの同期

ワーカーは、同じクラスター内の他のワーカーとの同期を試みます。

同期されたデータには、現在、取り消されたタスクと論理クロックが含まれています。

これは起動時にのみ発生し、他のワーカーからのブロードキャスト応答を収集するために1秒の起動遅延が発生します。

celery worker --without-mingleオプションを使用して、このブートステップを無効にできます。


ゴシップ:労働者<->労働者のコミュニケーション

労働者は現在、ハートビートのような労働者関連のイベントに受動的に加入しています。

これは、ワーカーが他のワーカーが何をしているかを知っており、オフラインになるかどうかを検出できることを意味します。 現在、これはクロック同期にのみ使用されますが、将来追加される可能性が多く、すでにこれを利用する拡張機能を作成できます。

一部のアイデアには、コンセンサスプロトコル、タスクを最適なワーカーに再ルーティングする(リソースの使用状況またはデータの局所性に基づく)、またはワーカーがクラッシュしたときにワーカーを再起動するなどがあります。

これは小さな追加ですが、驚くべき可能性を開くと信じています。

celery worker --without-gossipオプションを使用して、このブートステップを無効にできます。


ブートステップ:ワーカーの拡張

ブートステップを作成することで、ワーカーのコンシューマー部分を簡単に拡張して、カスタムメッセージコンシューマーなどの機能を追加できるようになりました。

ワーカーはしばらくの間ブートステップを使用していますが、これらは文書化されていません。 このバージョンでは、ワーカーのコンシューマー部分もブートステップを使用するように書き直され、新しい Extensions and Bootsteps ガイドには、カスタムメッセージコンシューマーの追加など、ワーカーを拡張する例が記載されています。

詳細については、拡張機能とブートステップガイドを参照してください。

ノート

APIが大幅に変更されたため、古いバージョン用に作成されたブートステップはこのバージョンと互換性がありません。

古いAPIは実験的で内部的なものでしたが、それを使用するのが不運な場合は、メーリングリストに連絡してください。ブートステップを新しいAPIに移植するお手伝いをします。


新しいRPC結果バックエンド

amqp結果バックエンドのこの新しい実験バージョンは、タスクを開始するプロセスが常に結果を取得するプロセスである従来のRPCシナリオで使用するための優れた代替手段です。

昆布を使用して結果を送受信し、各クライアントは返信の送信先として一意のキューを使用します。 これにより、タスクごとに1つのキューを作成する元のamqp結果バックエンドの大きなオーバーヘッドが回避されます。

デフォルトでは、このバックエンドを使用して送信された結果は保持されないため、ブローカーの再起動後も存続しません。 :setting: `CELERY_RESULT_PERSISTENT` 設定を有効にして変更できます。

CELERY_RESULT_BACKEND = 'rpc'
CELERY_RESULT_PERSISTENT = True

コードは現在、RPCバックエンドではサポートされていないことに注意してください。


クライアントが制限時間を設定できるようになりました

CallingAPIにtime_limitsoft_time_limitの2つの新しいオプションが追加されました。

>>> res = add.apply_async((2, 2), time_limit=10, soft_time_limit=8)

>>> res = add.subtask((2, 2), time_limit=10, soft_time_limit=8).delay()

>>> res = add.s(2, 2).set(time_limit=10, soft_time_limit=8).delay()

MherMovsisyanによる寄稿。


Redis:ブロードキャストメッセージと仮想ホスト

ブロードキャストメッセージは現在、Redisトランスポートを使用しているときにすべての仮想ホストで表示されます。 メッセージが分離されるようにすべてのチャネルにプレフィックスを有効にすることで、これを修正できるようになりました。

BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}

古いバージョンを実行しているワーカーや、この設定が有効になっていないワーカーとは通信できないことに注意してください。

この設定は、将来のバージョンのデフォルトになります。

問題#1490に関連しています。


:pypi: `pytz` は:pypi:` python-dateutil` の依存関係を置き換えます

Celeryは:pypi: `python-dateutil` ライブラリに依存しなくなりましたが、代わりに:pypi:` pytz` ライブラリへの新しい依存関係が追加されました。

:pypi: `pytz` ライブラリは、正確なタイムゾーンサポートのためにすでに推奨されています。

これは、依存関係がPython2とPython3の両方で同じであり、requirements/default-py3k.txtファイルが削除されたことも意味します。


:pypi: `setuptools` の追加要件のサポート

Pipは:pypi: `setuptools` の追加要件フォーマットをサポートするようになったため、古いバンドルの概念を削除し、代わりにsetuptoolsextrasを指定しました。

角かっこで囲んで指定することにより、エクストラをインストールします。

$ pip install celery[redis,mongodb]

上記は、RedisとMongoDBの依存関係をインストールします。 必要な数のエキストラをリストできます。

警告

celery-with-*パッケージは、Celery 3.1を使用するように更新されないため、使用できなくなりました。


拡大 要件エントリ タイプ
Redis celery[redis] トランスポート、結果バックエンド
MongoDB celery[mongodb] トランスポート、結果バックエンド
CouchDB celery[couchdb] 輸送
Beanstalk celery[beanstalk] 輸送
ZeroMQ celery[zeromq] 輸送
Zookeeper celery[zookeeper] 輸送
SQLAlchemy celery[sqlalchemy] トランスポート、結果バックエンド
librabbitmq celery[librabbitmq] トランスポート(C amqpクライアント)

例を含む完全なリストは、バンドルセクションにあります。


subtask.__call__()がタスクを直接実行するようになりました

誤解により、Signature.__call__.delayのエイリアスになりましたが、これは、基になるタスクメソッドを呼び出すTaskの呼び出しAPIに準拠していません。

この意味は:

@app.task
def add(x, y):
    return x + y

add.s(2, 2)()

これで、タスクを直接呼び出すのと同じようになります。

>>> add(2, 2)

ほかのニュースでは

  • 昆布3.0 に依存するようになりました。

  • 現在、:pypi: `billiard` バージョン3.3に依存しています。

  • pickleを有効にしてrootユーザーとして実行すると、ワーカーがクラッシュするようになりました。

  • キャンバス:group.apply_asyncchain.apply_asyncが別々のタスクを開始しなくなりました。

    グループプリミティブとコードプリミティブが他のサブタスクのように「APIの呼び出し」をサポートしていることは素晴らしいアイデアでしたが、実際には役に立たず、ユーザーを混乱させることがよくありました。 それでもこの動作が必要な場合は、それを実行するタスクを定義できます。

  • 新しいメソッドSignature.freeze()を使用して、署名/サブタスクを「ファイナライズ」できます。

    通常の署名:

    >>> s = add.s(2, 2)
    >>> result = s.freeze()
    >>> result
    <AsyncResult: ffacf44b-f8a1-44e9-80a3-703150151ef2>
    >>> s.delay()
    <AsyncResult: ffacf44b-f8a1-44e9-80a3-703150151ef2>

    グループ:

    >>> g = group(add.s(2, 2), add.s(4, 4))
    >>> result = g.freeze()
    <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [
        70c0fb3d-b60e-4b22-8df7-aa25b9abc86d,
        58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
    >>> g()
    <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [70c0fb3d-b60e-4b22-8df7-aa25b9abc86d, 58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
  • コード例外動作が定義されました(問題#1172)。

    このバージョンから、コードのタスク部分で例外が発生すると、コードコールバックは状態をFAILUREに変更します。

    詳細については、エラー処理を参照してください。

  • ワーカーおよびビートプログラムに追加のコマンドラインオプションを指定する新機能。

    @user_options属性を使用して、コマンドライン引数を追加できます。optparseスタイルのオプションが必要です。

    from celery import Celery
    from celery.bin import Option
    
    app = Celery()
    app.user_options['worker'].add(
        Option('--my-argument'),
    )

    詳細については、拡張機能とブートステップガイドを参照してください。

  • すべてのイベントにpidフィールドが含まれるようになりました。これは、イベントを送信したプロセスのプロセスIDです。

  • イベントのハートビートは、ワーカーによって報告された時間ではなく、モニターによってイベントが受信された時間に基づいて計算されるようになりました。

    これは、クロックが同期していないワーカーがモニターに「オフライン」として表示されなくなることを意味します。

    送信者の時間と内部時間の差が15秒を超えると、警告が発行されるようになりました。これは、クロックが同期していないことを示しています。

  • 単調な時計のサポート。

    単調なクロックがタイムアウトとスケジューリングに使用されるようになりました。

    単調時計関数はPython3.4から組み込まれていますが、LinuxとmacOSのフォールバック実装もあります。

  • セロリワーカーは、ワーカーをデーモンとしてバックグラウンドで起動するための新しい--detach引数をサポートするようになりました。

  • @events.Receiverは、着信イベントのlocal_receivedフィールドを設定するようになりました。これは、イベントが受信された時刻に設定されます。

  • @events.Dispatcherは、送信されるイベントグループのホワイトリストを決定するgroups引数を受け入れるようになりました。

    イベントのタイプは、「-」で区切られた文字列です。最初の「-」の前の部分はグループです。 現在、workertaskの2つのグループしかありません。

    ディスパッチャは次のようにインスタンス化されました。

    >>> app.events.Dispatcher(connection, groups=['worker'])

    ワーカー関連のイベントのみを送信し、他のグループに関連するイベントを送信しようとする試みはすべてサイレントにドロップします。

  • 新しい:setting: `BROKER_FAILOVER_STRATEGY` 設定。

    この設定は、トランスポートフェイルオーバー戦略を変更するために使用できます。呼び出し可能で反復可能を返すか、Kombu組み込みフェイルオーバー戦略の名前である可能性があります。 デフォルトは「ラウンドロビン」です。

    MattWiseによる寄稿。

  • Result.revokeは応答を待機しなくなりました。

    ワーカーからの応答を本当に待ちたい場合は、reply=True引数を追加できます。

  • コードのlinkおよびlink_errorタスクのサポートが向上しました。

    SteeveMorinによる寄稿。

  • ワーカー::setting: `CELERYD_POOL` 設定がイベントレット/イベントプールを有効にするように設定されている場合、警告を発するようになりました。

    -P オプションを常に使用して、イベントレット/イベントプールを選択し、パッチができるだけ早く適用されるようにする必要があります。

    ラッパー(Djangoのmanage.pyなど)でワーカーを開始する場合は、パッチを手動で適用する必要があります。たとえば、他のモジュールをインポートする前に、プログラムの開始時にモンキーパッチを適用する代替ラッパーを作成します。

  • 現在、ワーカーから現在の論理クロック値を収集する「inspectclock」コマンドがあります。

  • celery inspect stats に、ワーカーのメインプロセスのプロセスIDが含まれるようになりました。

    MherMovsisyanによる寄稿。

  • ワーカー構成をダンプするための新しいリモートコントロールコマンド。

    例:

    $ celery inspect conf

    構成値は、可能な場合、JSONでサポートされている値に変換されます。

    MherMovsisyanによる寄稿。

  • 新しい設定:setting: `CELERY_EVENT_QUEUE_TTL` および:setting:` CELERY_EVENT_QUEUE_EXPIRES`

    これらは、モニターイベントキューがいつ削除されるか、およびそのキューに公開されたイベントが表示される期間を制御します。 RabbitMQでのみサポートされます。

  • 新しいCouchbase結果バックエンド。

    この結果バックエンドを使用すると、 Couchbase を使用してタスクの結果を保存および取得できます。

    この結果バックエンドの構成の詳細については、 Couchbaseバックエンド設定を参照してください。

    AlainMasieroによる寄稿。

  • CentOS init-scriptは、複数のワーカーインスタンスの開始をサポートするようになりました。

    詳細については、スクリプトヘッダーを参照してください。

    ジョナサンジョーダンによって寄稿されました。

  • AsyncResult.iter_nativeはデフォルトの間隔パラメーターを0.5に設定するようになりました

    IdanKamaraによる修正

  • 新しい設定:setting: `BROKER_LOGIN_METHOD`

    この設定を使用して、AMQPトランスポートの代替ログイン方法を指定できます。

    AdrienGuinetによる寄稿

  • dump_confリモートコントロールコマンドは、JSON互換ではないタイプの文字列表現を提供するようになりました。

  • 関数 celery.security.setup_security は@setup_security()になりました。

  • タスクの再試行により、メッセージの有効期限の値が伝播されるようになりました(問題#980)。

    値はisで転送されるため、有効期限は変更されません。 有効期限を更新するには、retry()に新しいexpires引数を渡す必要があります。

  • チャネルエラーが発生すると、ワーカーがクラッシュするようになりました。

    チャネルエラーはトランスポート固有であり、Connection.channel_errorsによって返される例外のリストです。 RabbitMQの場合、これは、:setting: `CELERY_QUEUES` のキューの1つが不一致であるかどうかを同等性チェックすると、Celeryがクラッシュすることを意味します。これは、手動による介入が必要なシナリオであるため、理にかなっています。

  • チェーンでAsyncResult.get()を呼び出すと、前のタスクのエラーが伝播されるようになりました(問題#1014)。

  • AsyncResultの親属性は、JSONシリアル化を使用するときに再構築されるようになりました(問題#1014)。

  • ワーカー切断ログは、エラーではなく重大度の警告とともにログに記録されるようになりました。

    クリスアダムスによって寄稿されました。

  • events.Stateは、不明なイベントタイプを受信したときにクラッシュしなくなりました。

  • SQLAlchemy結果バックエンド:新しい:setting: `CELERY_RESULT_DB_TABLENAMES` 設定を使用して、使用するデータベーステーブルの名前を変更できます。

    RyanPetrelloによる寄稿。

  • SQLAlchemy結果バックエンド:フォーク後にenginge.disposeを呼び出すようになりました

    (問題#1564)。

    独自のSQLAlchemyエンジンを作成する場合は、ワーカーでフォークした後にこれらが閉じていることも確認する必要があります。

    from multiprocessing.util import register_after_fork
    
    engine = create_engine(*engine_args)
    register_after_fork(engine, engine.dispose)
  • セロリ労働者のためのストレステストスイートが書かれています。

    これは、gitリポジトリのfuntests/stressディレクトリにあります。 開始するためのREADMEファイルがあります。

  • celery.concurrencyという名前のロガーはcelery.poolに名前が変更されました。

  • 新しいコマンドラインユーティリティcelery graph

    このユーティリティは、GraphVizドット形式でグラフを作成します。

    現在インストールされているブートステップからグラフを作成できます。

    # Create graph of currently installed bootsteps in both the worker
    # and consumer name-spaces.
    $ celery graph bootsteps | dot -T png -o steps.png
    
    # Graph of the consumer name-space only.
    $ celery graph bootsteps consumer | dot -T png -o consumer_only.png
    
    # Graph of the worker name-space only.
    $ celery graph bootsteps worker | dot -T png -o worker_only.png

    または、クラスター内のワーカーのグラフ:

    # Create graph from the current cluster
    $ celery graph workers | dot -T png -o workers.png
    
    # Create graph from a specified list of workers
    $ celery graph workers nodes:w1,w2,w3 | dot -T png workers.png
    
    # also specify the number of threads in each worker
    $ celery graph workers nodes:w1,w2,w3 threads:2,4,6
    
    # …also specify the broker and backend URLs shown in the graph
    $ celery graph workers broker:amqp:// backend:redis://
    
    # …also specify the max number of workers/threads shown (wmax/tmax),
    # enumerating anything that exceeds that number.
    $ celery graph workers wmax:10 tmax:3
  • アプリインスタンスのpickle化の方法を変更しました。

    アプリは、古いAppPickler属性の代わりに使用される__reduce_keys__メソッドを定義できるようになりました。 たとえば、アプリで酸洗い時に保持する必要のあるカスタムの「foo」属性を定義している場合は、__reduce_keys__を次のように定義できます。

    import celery
    
    class Celery(celery.Celery):
    
        def __init__(self, *args, **kwargs):
            super(Celery, self).__init__(*args, **kwargs)
            self.foo = kwargs.get('foo')
    
        def __reduce_keys__(self):
            return super(Celery, self).__reduce_keys__().update(
                foo=self.foo,
            )

    これは、カスタム属性のピクルス化のサポートを追加するためのはるかに便利な方法です。 古いAppPicklerは引き続きサポートされていますが、その使用は推奨されておらず、将来のバージョンで削除したいと考えています。

  • デバッグ目的でインポートをトレースする機能。

    C_IMPDEBUGは、インポートが発生したときにそれをトレースするように設定できます。

    $ C_IMDEBUG=1 celery worker -l info
    $ C_IMPDEBUG=1 celery shell
  • タスクリクエストの一部としてメッセージヘッダーが利用できるようになりました。

    ヘッダー値の追加と取得の例:

    @app.task(bind=True)
    def t(self):
        return self.request.headers.get('sender')
    
    >>> t.apply_async(headers={'sender': 'George Costanza'})
  • 新しい:signal: `before_task_publish` シグナルは、タスクメッセージが送信される前にディスパッチされ、最終的なメッセージフィールドを変更するために使用できます(問題#1281)。

  • 新しい:signal: `after_task_publish` シグナルは、古い:signal:` task_sent` シグナルを置き換えます。

    :signal: `task_sent` シグナルは非推奨になり、使用しないでください。

  • 新しい:signal: `worker_process_shutdown` シグナルは、終了時にプリフォークプールの子プロセスにディスパッチされます。

    Daniel MTaubによる寄稿。

  • celery.platforms.PIDFilecelery.platforms.Pidfileに名前が変更されました。

  • MongoDBバックエンド:URLを使用して構成できるようになりました:

  • MongoDBバックエンド:非推奨のpymongo.Connectionを使用しなくなりました。

  • MongoDBバックエンド:auto_start_requestを無効にするようになりました。

  • MongoDBバックエンド:eventlet / geventが使用されているときにuse_greenletsを有効にするようになりました。

  • subtask() / maybe_subtask()signature() / maybe_signature()に名前が変更されました。

    下位互換性のためにエイリアスは引き続き使用できます。

  • correlation_idメッセージプロパティが自動的にタスクのIDに設定されるようになりました。

  • タスクメッセージetaおよびexpiresフィールドにタイムゾーン情報が含まれるようになりました。

  • すべての結果バックエンドstore_result / mark_as_*メソッドは、requestキーワード引数を受け入れる必要があります。

  • 壊れたyajlライブラリが使用されている場合、イベントが警告を発するようになりました。

  • :signal: `celeryd_init` シグナルは、追加のキーワード引数optionを受け取るようになりました。

    これは、解析されたコマンドライン引数のマッピングであり、新しいプリロード引数(app.user_options['preload'])を準備するために使用できます。

  • 新しいコールバック:@on_configure()

    このコールバックは、アプリが構成されようとしているときに呼び出されます(構成キーが必要です)。

  • ワーカー::sig: `HUP` でフォークしなくなりました。

    これは、ワーカーが同じpidを再利用して、外部のプロセススーパーバイザーとのサポートを改善することを意味します。

    JameelAl-Azizによる寄稿。

  • ワーカー:ログメッセージGot task from broker …Received task …に変更されました。

  • ワーカー:ログメッセージSkipping revoked task …Discarding revoked task …に変更されました。

  • 最適化:ResultSet.join_native()のパフォーマンスが向上しました。

    StasRudakouによる寄稿。

  • :signal: `task_revoked` シグナルは、新しいrequest引数を受け入れるようになりました(問題#1555)。

    取り消されたシグナルは、タスク要求がスタックから削除された後にディスパッチされるため、代わりにRequestオブジェクトを使用してタスクに関する情報を取得する必要があります。

  • ワーカー:キューを除外するための新しい-Xコマンドライン引数(問題#1399)。

    -X引数は-Q引数の逆であり、除外する(消費しない)キューのリストを受け入れます。

    # Consume from all queues in CELERY_QUEUES, but not the 'foo' queue.
    $ celery worker -A proj -l info -X foo
  • 単純なinit-script / celery multi デバッグ用の C_FAKEFORK環境変数を追加します。

    これは、次のことができることを意味します。

    $ C_FAKEFORK=1 celery multi start 10

    また:

    $ C_FAKEFORK=1 /etc/init.d/celeryd start

    stdout / stderrがないために表示されないエラーを確認するためのデーモン化手順を回避するため。

    dryrunコマンドが、このオプションを有効にする汎用init-scriptに追加されました。

  • 現在のタスクスタックからプッシュおよびポップする新しいパブリックAPI:

    celery.app.push_current_task()およびcelery.app.pop_current_task`()

  • RetryTaskErrorRetryに名前が変更されました。

    下位互換性のために、古い名前は引き続き使用できます。

  • 新しい半述語例外Reject

    この例外は、タスクメッセージreject / requeueに発生する可能性があります。例については拒否を参照してください。

  • Semipredicates が文書化されています:(再試行/無視/拒否)。


予定された削除

  • BROKER_INSIST設定および~@connectionへのinsist引数はサポートされなくなりました。

  • CELERY_AMQP_TASK_RESULT_CONNECTION_MAX設定はサポートされなくなりました。

    代わりに:setting: `BROKER_POOL_LIMIT` を使用してください。

  • CELERY_TASK_ERROR_WHITELIST設定はサポートされなくなりました。

    代わりに、タスククラスのErrorMail属性を設定する必要があります。 :setting: `CELERY_ANNOTATIONS` :を使用してこれを行うこともできます。

    from celery import Celery
    from celery.utils.mail import ErrorMail
    
    class MyErrorMail(ErrorMail):
        whitelist = (KeyError, ImportError)
    
        def should_send(self, context, exc):
            return isinstance(exc, self.whitelist)
    
    app = Celery()
    app.conf.CELERY_ANNOTATIONS = {
        '*': {
            'ErrorMail': MyErrorMails,
        }
    }
  • ブローカー接続を作成する関数は、connect_timeout引数をサポートしなくなりました。

    これは、:setting: `BROKER_CONNECTION_TIMEOUT` 設定を使用してのみ設定できるようになりました。 これは、関数が直接接続を作成するのではなく、接続プールから接続を取得するためです。

  • CELERY_AMQP_TASK_RESULT_EXPIRES設定はサポートされなくなりました。

    代わりに:setting: `CELERY_TASK_RESULT_EXPIRES` を使用してください。


非推奨のタイムラインの変更

Celery Deprecation Time-line を参照してください。


修正

  • AMQPバックエンド:jsonシリアライザーを使用するときにjoinが例外を変換しませんでした。

  • 非抽象タスククラスがアプリ間で共有されるようになりました(問題#1150)。

    新しいAPIでは非抽象タスククラスを使用しないでください。 @taskデコレータで基本クラスとして使用する場合にのみ、カスタムタスククラスを作成する必要があります。

    この修正により、古いバージョンのCeleryとの下位互換性が確保され、モジュールが複数回インポートされた場合でも非抽象タスククラスが機能するため、アプリも複数回インスタンス化されます。

  • ワーカー:ログ内のUnicodeエラーの回避策(問題#427)。

  • タスクメソッド:.apply_asyncは、argsリストがNoneの場合に正しく機能するようになりました(問題#1459)。

  • Eventlet / gevent / solo / threadsプールは、タスクによって発生したBaseExceptionエラーを適切に処理するようになりました。

  • :control: `autoscale` および:control:` pool_grow` / :control: `pool_shrink` リモートコントロールコマンドも、コンシューマーを自動的に増減するようになりましたプリフェッチカウント。

    DanielMによって提供された修正。 タウブ。

  • celery control pool_コマンドは、文字列引数をintに強制変換しませんでした。

  • Redis / Cacheコード:グループがデータベースから消えた場合、コールバック結果が失敗に設定されるようになりました(問題#1094)。

  • ワーカー:シャットダウンプロセスが複数回開始されていないことを確認します。

  • プログラム: celery multi は、-f--logfileの両方のオプションを適切に処理するようになりました(問題#1541)。


内部の変更

  • モジュールcelery.task.tracecelery.app.traceに名前が変更されました。

  • モジュールcelery.concurrency.processescelery.concurrency.preforkに名前が変更されました。

  • デフォルトのアプリの使用にフォールバックしなくなったクラス:

    • 結果のバックエンド(celery.backends.base.BaseBackend

    • celery.worker.WorkController

    • celery.worker.Consumer

    • celery.worker.request.Request

    これは、これらのクラスをインスタンス化するときに特定のアプリを渡す必要があることを意味します。

  • EventDispatcher.copy_buffer@events.Dispatcher.extend_buffer()に名前が変更されました。

  • 未使用で文書化されていないグローバルインスタンスcelery.events.state.stateを削除しました。

  • @events.Receiverkombu.mixins.ConsumerMixinサブクラスになりました。

  • celery.apps.worker.Workerは、celery.worker.WorkControllerのサブクラスとしてリファクタリングされました。

    これにより、多くの重複する機能が削除されます。

  • Celery.with_default_connectionメソッドは削除され、with app.connection_or_acquire@connection_or_acquire())が優先されます。

  • celery.results.BaseDictBackendクラスは削除され、celery.results.BaseBackendに置き換えられました。