Celery 2.5の新機能—Pythonドキュメント

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

Celery2.5の新機能

Celeryは、そのようなシステムを維持するためのツールを操作に提供しながら、大量のメッセージを分散して処理するための柔軟で信頼性の高い、最善のソリューションになることを目指しています。

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

セロリの詳細については、ウェブサイトをご覧ください。

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

CeleryをDjangoと組み合わせて使用する場合は、 django-celery changelog にアップグレードします :pypi: `django-celery 2.5 `

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

重要な注意事項

ブローカー接続プールがデフォルトで有効になりました

デフォルトの制限は10接続です。同時に接続を使用するスレッド/グリーンスレッドが多数ある場合は、競合を回避するためにこの制限を微調整することをお勧めします。

詳細については、:setting: `BROKER_POOL_LIMIT` 設定を参照してください。

また、公開タスクはデフォルトで再試行されることに注意してください。このデフォルトまたはデフォルトの再試行ポリシーを変更するには、:setting: `CELERY_TASK_PUBLISH_RETRY` および:setting:` CELERY_TASK_PUBLISH_RETRY_POLICY` を参照してください。


Rabbit Result Backend:Exchangeは自動削除ではなくなりました

Rabbit(AMQP)結果バックエンドの結果に使用される交換では、 auto_delete フラグが設定されていたため、競合状態が発生し、迷惑な警告が発生する可能性がありました。

RabbitMQユーザーの場合

auto_delete フラグを有効にして作成された古い交換は削除する必要があります。

camqadm コマンドを使用して、前の交換を削除できます。

$ camqadm exchange.delete celeryresults

古い取引所を削除する代わりに、取引所に新しい名前を設定できます。

CELERY_RESULT_EXCHANGE = 'celeryresults2'

ただし、すべてのクライアントとワーカーがこの新しい設定を使用していることを確認する必要があるため、同じ交換名を使用するように更新されます。


労働者をぶら下げるための解決策(ただし、手動で有効にする必要があります)

CELERYD_FORCE_EXECV 設定が追加され、スレッドとフォークが混在しているときに発生するデッドロックの問題が解決されました。

CELERYD_FORCE_EXECV = True

この設定は、プリフォークプールを使用するすべてのユーザーに推奨されますが、特に時間制限または子ごとの最大タスク設定を使用するユーザーにも推奨されます。

  • この問題の詳細と、execv`()を使用することが唯一の安全な解決策である理由については、 Python Issue 6721 を参照してください。

このオプションを有効にすると、新しいチャイルドワーカープロセスが開始されたときにパフォーマンスがわずかに低下し、メモリ使用量も増加します(ただし、多くのプラットフォームが最適化されているため、影響は最小限に抑えられます)。 失われたワーカープロセスを置き換えるときに信頼性が保証されることを考えると、それだけの価値があるはずです。

  • これはすでにWindowsのデフォルトの動作です。
  • これは、将来のバージョンではすべてのプラットフォームのデフォルトの動作になります。


最適化

  • ワーカーがタスクを実行するときに使用されるコードパスは大幅に最適化されています。つまり、ワーカーは以前のバージョンと比較して、1秒あたりはるかに多くのタスクを処理できます。 例として、:pypi: `pylibrabbitmq` トランスポートを使用すると、ソロプールは4コアMacBook Proで最大15000タスク/秒を処理できるようになりました。以前は5000タスク/秒しか実行できませんでした。
  • タスクエラーのトレースバックがはるかに短くなりました。
  • レート制限が有効になっている場合のタスク処理の顕著な遅延が修正されました。


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

削除

  • (task_name, list_of_tasks)の古いTaskSet署名は使用できなくなりました(当初は2.4で削除される予定です)。 非推奨の.task_nameおよび.task属性も削除されました。
  • 関数celery.execute.delay_taskcelery.execute.apply、およびcelery.execute.apply_asyncは削除され、(当初は)2.3で削除される予定です。
  • 組み込みのpingタスクは削除されました(当初は2.3で削除される予定です)。 代わりにpingbroadcastコマンドを使用してください。
  • subtaskTaskSetcelery.task.baseからインポートすることはできなくなりました。代わりにcelery.taskからインポートしてください(当初は2.4で削除される予定です)。


非推奨のモジュール

  • celery.decoratorsモジュールは、ステータスを保留中の非推奨から非推奨に変更し、バージョン4.0で削除される予定です。 代わりにcelery.taskモジュールを使用する必要があります。


ニュース

タイムゾーンのサポート

Celeryは、すべての着信日と発信日をUTCとして扱うように構成できるようになり、ローカルタイムゾーンを構成できるようになりました。

タイムゾーンサポートを有効にすると、バージョン2.5より前のバージョンを実行しているワーカーがアップグレードされたワーカーと同期しなくなるため、これはデフォルトではまだ有効になっていません。

UTCを有効にするには、:setting: `CELERY_ENABLE_UTC` を設定する必要があります:

CELERY_ENABLE_UTC = True

UTCが有効になっている場合、タスクメッセージの日付と時刻はUTCに変換され、ワーカーが受信したときにローカルタイムゾーンに変換されます。

:setting: `CELERY_TIMEZONE` 設定を使用して、ローカルタイムゾーンを変更できます。 カスタムタイムゾーンを使用する場合は、タイムゾーン定義を最新の状態に保つために:pypi: `pytz` ライブラリをインストールすることをお勧めしますが、可能な場合はタイムゾーンのシステム定義にフォールバックします。

UTCは、バージョン3.0でデフォルトで有効になります。

ノート

:pypi: `django-celery` は、TIME_ZONE設定で指定されたローカルタイムゾーンを使用し、Django1.4で導入された新しい USE_TZ 設定も尊重します。


暗号署名を使用した新しいセキュリティシリアライザー

メッセージの署名と検証を行う新しいシリアライザーが追加されました。

新しいシリアライザーの名前はauthであり、機能するには追加の構成が必要です(セキュリティを参照)。

も参照してください

安全


MherMovsisyanによる寄稿。


新しい :setting: `CELERY_ANNOTATIONS` 設定

この新しい設定により、構成でタスククラスとその属性を変更できます。

設定は、dict、またはタスクをフィルタリングして変更する属性のマップを返す注釈オブジェクトのリストにすることができます。

例として、これはtasks.addタスクのrate_limit属性を変更するための注釈です。

CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '10/s'}}

または、すべてのタスクで同じように変更します。

CELERY_ANNOTATIONS = {'*': {'rate_limit': '10/s'}}

on_failureハンドラーなど、メソッドを変更することもできます。

def my_on_failure(self, exc, task_id, args, kwargs, einfo):
    print('Oh no! Task failed: %r' % (exc,))

CELERY_ANNOTATIONS = {'*': {'on_failure': my_on_failure}}

より柔軟性が必要な場合は、注釈を付けるタスクをフィルタリングするオブジェクトを作成することもできます。

class MyAnnotate(object):

    def annotate(self, task):
        if task.name.startswith('tasks.'):
            return {'rate_limit': '10/s'}

CELERY_ANNOTATIONS = (MyAnnotate(), {other_annotations,})

currentは、現在実行中のタスクを提供します

新しいcelery.task.currentプロキシは、常に現在実行中のタスクを提供します。

from celery.task import current, task

@task
def update_twitter_status(auth, message):
    twitter = Twitter(auth)
    try:
        twitter.update_status(message)
    except twitter.FailWhale, exc:
        # retry in 10 seconds.
        current.retry(countdown=10, exc=exc)

以前は、ここにupdate_twitter_status.retry(…)と入力する必要がありましたが、これは長いタスク名では煩わしい場合があります。

ノート

タスク関数が直接呼び出された場合(つまり、update_twitter_status(a, b))、これは機能しません。 これを機能させるには、applyを使用する必要があります:update_twitter_status.apply((a, b))


ほかのニュースでは

  • 現在、昆布2.1.0に依存しています。

  • Memcachedバックエンドの効率的なChordサポート(問題#533)

    これは、Memcachedが非ポーリングコードを実行する機能でRedisに参加することを意味します。

    DanMcGeeによる寄稿。

  • Rabbit結果バックエンド(amqp)のChordサポートを追加します

    Rabbit結果バックエンドは、フォールバックコードソリューションを使用できるようになりました。

  • :sig: `QUIT`celerydに送信すると、コールドターミネートされます。

    つまり、現在作業中のタスクの実行が終了しません。

    AlecClowesによる寄稿。

  • Cassandraバックエンドの新しい「詳細」モード。

    Cassandraバックエンドの「詳細」モードを使用できます。 基本的には、Cassandraの幅の広い列を使用してすべての状態を維持するという考え方です。 次に、新しい状態が新しい列として行に追加されます。最後の状態が最後の列になります。

    :setting: `CASSANDRA_DETAILED_MODE` 設定を参照してください。

    SteeveMorinによる寄稿。

  • Crontabパーサーは、範囲をステップ(1-59 / 2など)で解析するときにVixieCronの動作と一致するようになりました。

    DanielHepperによる寄稿。

  • celerybeatは、celerydのようにコマンドラインで構成できるようになりました。

    引数リストの最後に--を続けて追加の構成を追加する必要があります。次に例を示します。

    $ celerybeat -l info -- celerybeat.max_loop_interval=10.0
  • celerydが例外を超えた最大再帰制限でクラッシュしないように、トレースバックのフレーム数を制限するようになりました(問題#615)。

    制限は、現在の再帰制限を8で割った値(デフォルトでは125)に設定されます。

    現在の再帰制限を取得または設定するには、sys.getrecursionlimit()およびsys.setrecursionlimit()を使用します。

  • より多くの情報がピクルス可能なトレースバックに保存されるようになりました。

    これは、Sentryが詳細を表示できるように追加されました。

    SeanO'Connorによる寄稿。

  • CentOS init-scriptが更新され、より柔軟になるはずです。

    AndrewMcFagueによる寄稿。

  • MongoDB結果バックエンドがforget()をサポートするようになりました。

    AndrewMcFagueによる寄稿

  • task.retry()は、元のスタックトレースを保持したまま、元の例外を再発生させるようになりました。

    :github_user: `ojii` によって提案されました。

  • デーモンの –uid 引数は、initgroups()を使用して、ユーザーがメンバーになっているすべてのグループにグループを設定するようになりました。

    ŁukaszOleśによる寄稿。

  • celeryctlshellコマンドを追加しました。

    シェルにはcurrent_app(celery)があり、すべてのタスクが自動的にローカルに追加されます。

  • celeryctlmigrateコマンドを追加しました。

    移行コマンドは、すべてのタスクを1つのブローカーから別のブローカーに移動します。 これは実験的なものであり、続行する前にデータのバックアップをとる必要があることに注意してください。

    $ celeryctl migrate redis://localhost amqp://localhost
    $ celeryctl migrate amqp://localhost//v1 amqp://localhost//v2
    $ python manage.py celeryctl migrate django:// redis://
  • ルーターは、欠落しているキューの作成に使用されるexchangeおよびrouting_keyをオーバーライドできるようになりました(問題#577)。

    デフォルトでは、これは常にキューの名前を使用しますが、ルーターのリターン交換キーとrouting_keyキーを使用してそれらを設定できるようになりました。

    これは、実行時に宛先を決定するルーティングクラスを使用する場合に役立ちます。

    松崎晃による寄稿。

  • Redis結果バックエンド:max_connectionsパラメーターのサポートを追加します。

    結果に使用されるRedis接続プールでの同時接続の最大数を構成できるようになりました。

    デフォルトの最大接続数設定は、:setting: `CELERY_REDIS_MAX_CONNECTIONS` 設定を使用して構成するか、RedisBackend(max_connections=int)で個別に変更できます。

    SteeveMorinによる寄稿。

  • Redis結果バックエンド:ポーリングせずに結果を待機する機能を追加します。

    SteeveMorinによる寄稿。

  • MongoDB結果バックエンド:保存と復元tasksetをサポートするようになりました。

    JulienPoissonnierによる寄稿。

  • ドキュメントに新しいセキュリティガイドがあります。

  • init-scriptsが更新され、多くのバグが修正されました。

    クリス・ストリーターによる寄稿。

  • ユーザー(チルダ)がコマンドライン引数で展開されるようになりました。

  • /etc/default/celeryd CELERYCTL環境変数を構成できるようになりました。

    操作には必要ありませんが、celeryd statusコマンドには celeryctl を使用し、 celeryctl へのパスを設定する必要があります。

    デーモン化クックブックには例が含まれています。

    ジュード・ナガーニーによる寄稿。

  • MongoDB結果バックエンドでレプリカセットを使用できるようになりました。

    IvanMetzlarによる寄稿。

  • gevent:自動スケーリングをサポートするようになりました(問題#599)。

    MarkLavinによる寄稿。

  • マルチプロセッシング:プールセマフォがメインスレッドをブロックすることがわかっているため、レート制限が無効になっていても、メディエータースレッドが常に有効になり、ブロードキャストコマンドとシャットダウンが解放されているセマフォに依存するようになりました。


修正

  • 新しい例外オブジェクトで再発生した例外は、元のスタックトレースを保持するようになりました。

  • Windows:no handlers found for multiprocessing警告を修正しました。

  • Windows:celerydプログラムを使用できるようになりました。

    以前は、Windowsユーザーはpython -m celery.bin.celerydを使用してcelerydを起動する必要がありました。

  • 結果バックエンドのRedis:SETEXコマンドを使用して結果キーを設定し、アトミックに有効期限が切れるようになりました。

    :github_user: `yaniv-aknin` によって提案されました。

  • celeryd Control-c を使用して終了したときにシャットダウンがハングする問題を修正しました。

  • celeryd:チャネルエラーが発生したときにクラッシュしなくなりました。

    RogerHuによって提供された修正。

  • greenlet.getcurrentの使用によって引き起こされるイベントレットプールのメモリリークを修正しました。

    IgnasMikalajūnasによって提供された修正。

  • Cassandraバックエンド::pypi: `pycassa` 1.4以降非推奨となったpycassa.connect()を使用しなくなりました。

    修正はJeffTerraceによって提供されました。

  • エラーメールの送信中に発生する可能性があったUnicodeデコードエラーを修正しました。

    Seong WunMunによる修正。

  • celery.binプログラムは、PEP-366で推奨されているように、常に__package__を定義するようになりました。

  • send_taskは、:setting: `CELERY_ALWAYS_EAGER` と組み合わせて使用すると警告を発するようになりました(問題#581)。

    MherMovsisyanによる寄稿。

  • apply_asyncは、:setting: `CELERY_ALWAYS_EAGER` が有効になっている場合に、元のキーワード引数をapplyに転送するようになりました。

  • celeryevは、ブローカーへの接続が失われた場合に接続を再確立しようとするようになりました(問題#574)。

  • celeryev:タスクに関連するワーカー情報がない場合に発生するクラッシュを修正しました。

    MattWilliamsonによる修正。

  • 現在の日付と時刻は、現在のローダーnowメソッドから一貫して取得されるようになりました。

  • インポートできない.pyで終わる構成モジュールを指定すると、役立つエラーメッセージが表示されるようになりました。

  • celeryctl:applyコマンドの--expiresおよび--eta引数は、ISO-8601形式の文字列にできるようになりました。

  • celeryctlは、応答が受信されていない場合、終了ステータスEX_UNAVAILABLE(69)で終了するようになりました。