Celery 3.0(Chiastic Slide)の新機能—Pythonドキュメント
Celery 3.0(Chiastic Slide)の新機能
Celeryは、膨大な量のメッセージを処理すると同時に、そのようなシステムを維持するために必要なツールを操作に提供する、シンプルで柔軟性があり、信頼性の高い分散システムです。
これは、リアルタイム処理に重点を置いたタスクキューであり、タスクのスケジューリングもサポートしています。
Celeryには、ユーザーと寄稿者の大規模で多様なコミュニティがあります。IRCまたはメーリングリストでに参加する必要があります。
セロリの詳細については、はじめにをお読みください。
このバージョンは以前のバージョンと下位互換性がありますが、次のセクションを読むことが重要です。
CeleryをDjangoと組み合わせて使用する場合は、 django-celery changelog にアップグレードします :pypi: `django-celery 3.0 ` 。
このバージョンは、CPython 2.5、2.6、2.7、3.2、3.3、およびPyPyとJythonで公式にサポートされています。
ハイライト
概要
よりシンプルで強力な、新しく改良されたAPI。
誰もが新しい Celeryの最初のステップチュートリアルと新しい次のステップチュートリアルを読む必要があります。 ああ、そしてあなたがそれにいる間にユーザーガイドを読み直してみませんか:)
古いAPIを廃止する現在の計画はないため、アプリケーションを移植するために急いでいる必要はありません。
ワーカーはスレッドレスになり、パフォーマンスが大幅に向上しました。
新しい「Canvas」により、複雑なワークフローを簡単に定義できます。
タスクを連鎖させたいと思ったことはありませんか? これは可能ですが、それだけでなく、グループやコードをつなぎ合わせたり、複数のチェーンを組み合わせたりすることもできます。
詳細については、 Canvas ユーザーガイドをご覧ください。
Celeryのすべてのコマンドラインプログラムは、単一の celery アンブレラコマンドから利用できるようになりました。
これは、Python2.5をサポートする最後のバージョンです。
Celery 3.1以降、Python2.6以降が必要です。
新しい:pypi: `librabbitmq` Cクライアントのサポート。
Celeryは、インストールされている場合、:pypi: `librabbitmq` モジュールを自動的に使用します。これは、:pypi:` amqp` モジュールの非常に高速でメモリ最適化された代替品です。
ackエミュレーションが改善されたことで、Redisサポートの信頼性が高まりました。
セロリは常にUTCを使用するようになりました
600を超えるコミット、30kの追加/ 36kの削除。
比較すると、1.0→2.0では18kの追加/ 8kの削除がありました。
重要な注意事項
放送交換の名前が変更されました
ワーカーのリモートコントロールコマンド交換の名前が変更されました(新しい pidbox 名)。これは、交換のauto_delete
フラグが削除されたため、以前のバージョンとの互換性がなくなりました。
必要に応じて、 celery amqp コマンド(以前はcamqadm
と呼ばれていました)を使用して、古い交換を手動で削除できます。
$ celery amqp exchange.delete celeryd.pidbox
$ celery amqp exchange.delete reply.celeryd.pidbox
イベントループ
RabbitMQ(AMQP)またはRedisをブローカーとして使用すると、ワーカーはスレッドなしで ' を実行するようになり、次のようになります。
- 全体的なパフォーマンスが大幅に向上しました。
- いくつかのエッジケースの競合状態を修正します。
- サブミリ秒のタイマー精度。
- より速いシャットダウン時間。
サポートされているトランスポートは、py-amqp
librabbitmq
、redis
、およびamqplib
です。 うまくいけば、これを拡張して、将来的に追加のブローカートランスポートを含めることができます。
信頼性を高めるために、イベントループが使用されていない場合、:setting: `CELERY_FORCE_EXECV` 設定はデフォルトで有効になっています。
新しいceleryアンブレラコマンド
Celeryのすべてのコマンドラインプログラムは、単一の celery アンブレラコマンドから利用できるようになりました。
次のコマンドを実行すると、サブコマンドとオプションのリストが表示されます。
$ celery help
コマンドは次のとおりです。
celery worker
(以前はceleryd
)。celery beat
(以前はcelerybeat
)。celery amqp
(以前はcamqadm
)。
古いプログラム(celeryd
、celerybeat
など)は引き続き利用できますが、使用しないことをお勧めします。
:pypi: `billiard` に依存するようになりました
Billiardは、sbt
( http://bugs.python.org/issue8713 )によるno-execvパッチを含むマルチプロセッシングのフォークであり、以前はCeleryにあったプールの改善も含まれています。 。
no-execvパッチが機能するには、C拡張コードへの変更が必要だったため、このフォークが必要でした。
- 問題#625
- 課題#627
- 第640号
- django-celery#122
- django-celery#124
celery.app.taskはパッケージではなくなりました
celery.app.task
モジュールは、パッケージではなくモジュールになりました。
setup.py
インストールスクリプトは古いパッケージを削除しようとしますが、それが何らかの理由で機能しない場合は、手動で削除する必要があります。 このコマンドは次のことに役立ちます。
$ rm -r $(dirname $(python -c 'import celery;print(celery.__file__)'))/app/task/
ImportError: cannot import name _unpickle_task
のようなエラーが発生した場合は、古いパッケージを削除するだけで、すべて問題ありません。
Python2.5をサポートする最後のバージョン
3.0シリーズはPython2.5をサポートする最後のバージョンであり、3.1以降はPython2.6以降が必要になります。
他のいくつかのディストリビューションがPython2.5のサポートを終了するための措置を講じているため、今がその時だと感じています。
Python 2.6はこの時点で広く利用可能になるはずであり、アップグレードすることをお勧めしますが、それが不可能な場合でも、Celery 3.0を引き続き使用するオプションがあり、Celery3.1で導入された重要なバグ修正がCelery3.0にバックポートされます。要求に応じて。
UTCタイムゾーンが使用されるようになりました
これは、メッセージのETA /カウントダウンが2.5より前のCeleryバージョンと互換性がないことを意味します。
:setting: `CELERY_ENABLE_UTC` 設定を設定すると、UTCを無効にして、古い現地時間に戻すことができます。
Redis:Ackエミュレーションの改善
データ損失の可能性を減らします。
メッセージが消費されたときにメッセージのコピーを保存することにより、ackが実装されるようになりました。 コピーは、コンシューマーが承認または拒否するまで削除されません。
これは、接続が閉じられたとき、または可視性のタイムアウトを超えたときに、未確認のメッセージが再配信されることを意味します。
可視性のタイムアウト
これはackのタイムアウトであるため、コンシューマーがこの制限時間内にメッセージをackしなかった場合、メッセージは別のコンシューマーに再配信されます。
タイムアウトはデフォルトで1時間に設定されていますが、トランスポートオプションを構成することで変更できます。
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 18000} # 5 hours
ノート
確認されていないメッセージは、可視性タイムアウトを超えると再配信されます。Celeryユーザーの場合、これは、可視性タイムアウトを超える時間で実行するようにスケジュールされたETA /カウントダウンタスクが2回(またはそれ以上)実行されることを意味します。 長いETA /カウントダウンを使用する予定の場合は、それに応じて可視性のタイムアウトを微調整する必要があります。
長いタイムアウトを設定すると、停電時にメッセージが再配信されるまでに長い時間がかかりますが、その場合は、システムを再起動したときにメッセージをフラッシュするために、一時的に可視性タイムアウトを低く設定できます。
ニュース
連鎖タスク
タスクにコールバックとエラーバックを含めることができるようになり、依存関係が記録されます
タスクメッセージの形式が2つの新しい拡張キーで更新されました
両方のキーは、空/未定義またはサブタスクのリストにすることができます。
callbacks
タスクの結果を引数として、タスクが正常に終了した場合に適用されます。
errbacks
タスクのuuidを引数として、タスクの実行中にエラーが発生した場合に適用されます。 例外インスタンスをシリアル化できない可能性があるため、代わりにタスクのuuidを渡します。 次に、uuidを使用して、結果のバックエンドからタスクの例外とトレースバックを取得できます。
link
およびlink_error
キーワード引数がapply_async
に追加されました。これらはタスクにコールバックとエラーバックを追加します。これらの詳細については、リンク(コールバック/エラーバック)を参照してください。
タスクが送信するサブタスクを追跡し、一部の結果バックエンドがこの情報の取得をサポートするようになりました。
task.request.children
現在実行中のタスクが適用したサブタスクの結果インスタンスが含まれます。
AsyncResult.children
AsyncResult
/ResultSet
インスタンスのリストとしてタスクの依存関係を返します。AsyncResult.iterdeps
タスクの依存関係を再帰的に繰り返し、(親、ノード)タプルを生成します。
依存関係のいずれかがまだ返されていない場合は、IncompleteStreamを発生させます。
AsyncResult.graph
タスクの依存関係の
DependencyGraph
。 これを使用して、ドット形式に変換することもできます。with open('graph.dot') as fh: result.graph.to_dot(fh)
次に、グラフの画像を作成します。
$ dot -Tpng graph.dot -o graph.png
chain
と呼ばれる新しい特別なサブタスクも含まれています。>>> from celery import chain # (2 + 2) * 8 / 2 >>> res = chain(add.subtask((2, 2)), mul.subtask((8,)), div.subtask((2,))).apply_async() >>> res.get() == 16 >>> res.parent.get() == 32 >>> res.parent.parent.get() == 4
AsyncResult.get_leaf()
を追加しますリーフサブタスクの結果を待機して返します。 これは、グラフをトラバースするときに検出される最後のノードですが、これは、グラフが1次元のみ(実際にはリスト)であることを意味します。
subtask.link(subtask)
+subtask.link_error(subtask)
を追加しますs.options.setdefault('link', []).append(subtask)
へのショートカットsubtask.flatten_links()
を追加しますすべての依存関係のフラット化されたリストを(再帰的に)返します
Redis:優先サポート
メッセージのpriority
フィールドは、名前付きキューごとに複数のリストを持つことで、Redisトランスポートによって尊重されるようになりました。 次に、キューは優先度の高い順にによって消費されます。
優先度フィールドは、0〜9の範囲の数値です。ここで、0はデフォルトで最高の優先度です。
優先度の範囲は、デフォルトでは4つのステップにまとめられています。これは、9つのステップが4つのステップを使用するよりも多くのメリットをもたらす可能性が低いためです。 ステップ数は、priority_steps
トランスポートオプションを設定することで構成できます。これは、ソート順の番号のリストである必要があります。
>>> BROKER_TRANSPORT_OPTIONS = {
... 'priority_steps': [0, 2, 4, 6, 8, 9],
... }
この方法で実装された優先度は、サーバー側の優先度ほど信頼性が高くありません。そのため、この機能は「準優先度」と呼ばれます。 ルーティングを使用することは、サービス品質を確保するための推奨される方法です。たとえば、ワーカーが長時間実行されるタスクで忙しい場合、多くのメッセージをプリフェッチした場合、またはキューが混雑しています。
それでも、優先順位をルーティングと組み合わせて使用すると、ルーティングまたは優先順位を単独で使用するよりも有益な場合があります。 これを証明するには、実験と監視を使用する必要があります。
GermánMによる寄稿。 ブラボー。
Redis:消費が公平になるようにキューを循環させるようになりました
これにより、非常にビジーなキューが他のキューからのメッセージをブロックしないようになり、すべてのキューが消費される可能性が等しくなります。
以前はこれが当てはまりましたが、ブロッキングポップの使用に切り替えたときに誤って動作が変更されました。
group / chord / chain がサブタスクになりました
groupは
TaskSet
のエイリアスではなくなりましたが、TaskSet
クラスをサブタスクに移行することが非常に困難であったため、すべて一緒に新しくなりました。新しいショートカットがタスクに追加されました:
>>> task.s(arg1, arg2, kw=1)
ショートカットとして:
>>> task.subtask((arg1, arg2), {'kw': 1})
|
演算子を使用すると、タスクを連鎖させることができます。>>> (add.s(2, 2), pow.s(2)).apply_async()
サブタスクは、
~
演算子を使用して「評価」できます。>>> ~add.s(2, 2) 4 >>> ~(add.s(2, 2) | pow.s(2))
と同じです:
>>> chain(add.s(2, 2), pow.s(2)).apply_async().get()
新しいsubtask_typeキーがサブタスクディクショナリに追加されました。
これは、文字列
"chord"
、"group"
、"chain"
、"chunks"
、"xmap"
、または"xstarmap"
にすることができます。may_subtaskは、subtask_typeを使用してオブジェクトを再構築し、ピクルス以外のシリアライザーを使用するときに使用するようになりました。
これらの操作のロジックは、専用タスクcelery.chord、celery.chain、およびcelery.groupに移動されました。
サブタスクはAttributeDictから継承しなくなりました。
これは、関連するキーへの属性アクセス用のプロパティを持つ純粋なdictサブクラスになりました。
reprは、シーケンスがどのように必須であるかを出力するようになりました。
>>> from celery import chord >>> (chord([add.s(i, i) for i in xrange(10)], xsum.s()) | pow.s(2)) tasks.xsum([tasks.add(0, 0), tasks.add(1, 1), tasks.add(2, 2), tasks.add(3, 3), tasks.add(4, 4), tasks.add(5, 5), tasks.add(6, 6), tasks.add(7, 7), tasks.add(8, 8), tasks.add(9, 9)]) | tasks.pow(2)
新しいリモートコントロールコマンド
これらのコマンドは以前は実験的なものでしたが、安定していることが証明され、現在は公式APIの一部として文書化されています。
:control: `add_consumer` / :control:` cancel_consumer`
新しいキューから消費するか、キューからの消費をキャンセルするようにワーカーに指示します。 このコマンドも変更され、ワーカーは追加されたキューを記憶するようになり、接続が再接続されても変更が保持されるようになりました。
これらのコマンドは、プログラムで
@control.add_consumer()
/@control.cancel_consumer()
として使用できます。>>> celery.control.add_consumer(queue_name, ... destination=['w1.example.com']) >>> celery.control.cancel_consumer(queue_name, ... destination=['w1.example.com'])
またはセロリコントロールコマンドを使用します。
$ celery control -d w1.example.com add_consumer queue $ celery control -d w1.example.com cancel_consumer queue
ノート
宛先のない制御コマンドがすべてのワーカーに送信されることに注意してください。
-
--autoscale
が有効になっているワーカーに、自動スケールの最大/最小同時実行設定を変更するように指示します。このコマンドは、プログラムで
@control.autoscale()
として使用できます。>>> celery.control.autoscale(max=10, min=5, ... destination=['w1.example.com'])
またはセロリコントロールコマンドを使用します。
$ celery control -d w1.example.com autoscale 10 5
:control: `pool_grow` / :control:` pool_shrink`
プールプロセスを追加または削除するようにワーカーに指示します。
これらのコマンドは、プログラムで
@control.pool_grow()
/@control.pool_shrink()
として使用できます。>>> celery.control.pool_grow(2, destination=['w1.example.com']) >>> celery.contorl.pool_shrink(2, destination=['w1.example.com'])
またはセロリコントロールコマンドを使用します。
$ celery control -d w1.example.com pool_grow 2 $ celery control -d w1.example.com pool_shrink 2
セロリコントロールは、:control: `rate_limit` および:control:` time_limit` コマンドをサポートするようになりました。
詳細については、
celery control --help
を参照してください。
不変のサブタスク
subtask
は不変になりました。つまり、コールバックを呼び出すときに引数は変更されません。
>>> chain(add.s(2, 2), clear_static_electricity.si())
親タスクの引数を受け取らないことを意味し、.si()
は次のショートカットです。
>>> clear_static_electricity.subtask(immutable=True)
ロギングの改善
ロギングのサポートは、ベストプラクティスによりよく準拠するようになりました。
ワーカーが使用するクラスはapp.get_default_loggerを使用しなくなりましたが、 celery.utils.log.get_logger を使用して、レベルを設定せずにロガーを取得し、NullHandlerを追加します。
ロガーは渡されなくなりました。代わりに、ロギングを使用するすべてのモジュールが、全体で使用されるモジュールグローバルロガーを定義します。
すべてのロガーは、「セロリ」と呼ばれる一般的なロガーから継承します。
task.get_logger
がすべてのタスクに対して新しいロガーをセットアップし、ログレベルを設定する前。 これはもはや当てはまりません。代わりに、すべてのタスクロガーは、プログラムが setup_logging_subsystem を呼び出すときにセットアップされる共通の「celery.task」ロガーから継承するようになりました。
LoggerAdapterを使用してフォーマッターをtask_idおよびtask_nameフィールドで拡張する代わりに、タスクベースロガーは、実行時に現在実行中のタスクからこれらの値を追加する特別なフォーマッターを使用するようになりました。
実際、
task.get_logger
は推奨されなくなりました。タスクモジュールにモジュールレベルのロガーを追加することをお勧めします。たとえば、次のようになります。
from celery.utils.log import get_task_logger logger = get_task_logger(__name__) @celery.task def add(x, y): logger.debug('Adding %r + %r' % (x, y)) return x + y
結果のロガーは
"celery.task"
ロガーから継承されるため、現在のタスク名とIDがログ出力に含まれます。stdout / stderrからのリダイレクトされた出力は、「celery.redirected」ロガーに記録されるようになりました。
さらに、いくつかのwarnings.warnがlogger.warnに置き換えられました。
「ロガーマルチプロセッシングのハンドラーがありません」という警告を回避するようになりました
タスクレジストリはグローバルではなくなりました
すべてのCeleryインスタンスには、独自のタスクレジストリがあります。
次のように指定することで、アプリにレジストリを共有させることができます。
>>> app1 = Celery()
>>> app2 = Celery(tasks=app1.tasks)
タスクはデフォルトでレジストリ間で共有されるため、タスクはその後作成されるすべてのタスクレジストリに追加されることに注意してください。 別のタスクとして、shared
引数を@task
デコレータに設定することにより、特定のタスクレジストリにプライベートにすることができます。
@celery.task(shared=False)
def add(x, y):
return x + y
抽象タスクは今や怠惰にバインドされています
Task
クラスは、デフォルトではアプリにバインドされなくなりました。具体的なサブクラスが作成されるときに、最初にバインド(および構成)されます。
これは、アプリ環境を初期化することなく、タスクベースクラスを安全にインポートして作成できることを意味します。
from celery.task import Task
class DebugTask(Task):
abstract = True
def __call__(self, *args, **kwargs):
print('CALLING %r' % (self,))
return self.run(*args, **kwargs)
>>> DebugTask
<unbound DebugTask>
>>> @celery1.task(base=DebugTask)
... def add(x, y):
... return x + y
>>> add.__class__
<class add of <Celery default:0x101510d10>>
怠惰なタスクデコレータ
@task
デコレータは、カスタムアプリで使用すると遅延するようになりました。
つまり、accept_magic_kwargs
が有効になっている場合(彼女は「コンパットモード」と呼びます)、タスクデコレータは以前と同じようにインラインで実行されますが、カスタムアプリの場合、@ taskデコレータはアクセス時にのみ評価される特別なPromiseProxyオブジェクトを返すようになりました。
すべてのpromiseは、@finalize()
が呼び出されたとき、またはタスクレジストリが最初に使用されたときに暗黙的に評価されます。
スマート –アプリオプション
--app
オプションが「自動検出」になりました
- 指定されたパスがモジュールの場合、「celery」という名前の属性を取得しようとします。
- 指定されたパスがパッケージの場合、celery 'という名前のサブモジュールをインポートし、そのモジュールからcelery属性を取得しようとします。
たとえば、セロリアプリがfrom proj.celery import app
にあるproj
という名前のプロジェクトがある場合、次のようになります。
$ celery worker --app=proj
$ celery worker --app=proj.celery:
$ celery worker --app=proj.celery:app
ほかのニュースでは
新しい:setting: `CELERYD_WORKER_LOST_WAIT` は、ワーカーに信号を送信できないときに
billiard.WorkerLostError
が発生するまでのタイムアウトを秒単位で制御します(問題#595)。BrendonCrawfordによる寄稿。
Redisイベントモニターキューが自動的に削除されるようになりました(問題#436)。
アプリインスタンスのファクトリメソッドは、アクセス時に新しいサブクラスを作成するキャッシュ記述子に変換されました。
たとえば、これは
app.Worker
が実際のクラスであり、次の場合に期待どおりに機能することを意味します。class Worker(app.Worker): ...
新しいシグナル::signal: `task_success` 。
マルチプロセッシングログは、
MP_LOG
環境変数が設定されている場合にのみ発行されるようになりました。CeleryインスタンスをブローカーURLで作成できるようになりました
app = Celery(broker='redis://')
結果のバックエンドは、URLを使用して設定できるようになりました
現在、redisでのみサポートされています。 使用例:
CELERY_RESULT_BACKEND = 'redis://localhost/1'
ハートビートの頻度は5秒ごとになり、頻度はイベントとともに送信されます
ハートビートの頻度がワーカーイベントメッセージで利用できるようになったため、クライアントはこの値に基づいてワーカーをオフラインと見なすタイミングを決定できます。
モジュールcelery.actorsは削除され、代わりにclの一部になります。
他のすべてのコマンドのエントリポイントである新しい
celery
コマンドが導入されました。このコマンドのメインは、
celery.start()
を呼び出すことで実行できます。キーが「@」で始まる場合、注釈はデコレータをサポートするようになりました。
例えば:
def debug_args(fun): @wraps(fun) def _inner(*args, **kwargs): print('ARGS: %r' % (args,)) return _inner CELERY_ANNOTATIONS = { 'tasks.add': {'@__call__': debug_args}, }
また、タスクは常にクラスによってバインドされるようになったため、注釈付きのメソッドがバインドされることになります。
バグレポートがコマンドおよびブロードキャストコマンドとして利用可能になりました
PythonREPLから取得します。
>>> import celery >>> print(celery.bugreport())
celery
コマンドラインプログラムの使用:$ celery report
リモートワーカーから入手してください。
$ celery inspect report
モジュール
celery.log
がcelery.app.log
に移動しました。モジュール
celery.task.control
がcelery.app.control
に移動しました。新しいシグナル::signal: `task_revoked`
タスクが取り消されたとき、または終了したときに、メインプロセスで送信されます。
AsyncResult.task_id
はAsyncResult.id
に名前が変更されましたTasksetResult.taskset_id
は.id
に名前が変更されましたxmap(task, sequence)
およびxstarmap(task, sequence)
シーケンス内のすべてのアイテムにタスク関数を適用した結果のリストを返します。
例:
>>> from celery import xstarmap >>> xstarmap(add, zip(range(10), range(10)).apply_async() [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
chunks(task, sequence, chunksize)
group.skew(start=, stop=, step=)
スキューは、グループ内の個々のタスクのカウントダウンを歪めます。たとえば、このグループでは次のようになります。
>>> g = group(add.s(i, i) for i in xrange(10))
タスクを0秒から10秒にスキューします。
>>> g.skew(stop=10)
最初のタスクは0秒で実行され、2番目は1秒で実行され、3番目は2秒で実行されます。
99%のテストカバレッジ
:setting: `CELERY_QUEUES` を
Queue
インスタンスのリスト/タプルにすることができるようになりました。内部的には、
@amqp.queues
は、オンザフライで変換するのではなく、名前/キューインスタンスのマッピングになりました。@control.inspect
の接続を指定できるようになりました。from kombu import Connection i = celery.control.inspect(connection=Connection('redis://')) i.active_queues()
:setting: `CELERY_FORCE_EXECV` がデフォルトで有効になりました。
古い動作が必要な場合は、設定をFalseに設定するか、新しい –no-execv オプションを celeryworker に設定できます。
非推奨のモジュール
celery.conf
は削除されました。:setting: `CELERY_TIMEZONE` では、常に:pypi:` pytz` ライブラリをインストールする必要があります(タイムゾーンが UTC に設定されている場合を除く)。
Tokyo Tyrantバックエンドは削除され、サポートされなくなりました。
maybe_declare()
を使用してキュー宣言をキャッシュするようになりました。:setting: `CELERYBEAT_MAX_LOOP_INTERVAL` 設定のグローバルデフォルトはなくなり、代わりに個々のスケジューラーによって設定されます。
ワーカー:エラーレポートで非常に長いメッセージ本文を切り捨てるようになりました。
エラーをシリアル化しようとしたときに例外をディープコピーしなくなりました。
CELERY_BENCH
環境変数は、ワーカーのシャットダウン時のメモリ使用量の統計も一覧表示するようになりました。ワーカー:今では、すべてのタイミングのニーズに1つのタイマーのみを使用し、代わりに異なる優先順位を設定します。
例外引数が安全にピクルスになりました
MattLongによる寄稿。
Worker / Beatはスタートアップバナーをログに記録しなくなりました。
以前は重大度の警告とともにログに記録されていましたが、現在はstdoutにのみ書き込まれます。
ディストリビューションの
contrib/
ディレクトリの名前がextra/
に変更されました。新しいシグナル::signal: `task_revoked`
celery.contrib.migrate
:以下を含む多くの改善。 フィルタリング、キューの移行、および移行元のブローカーでのメッセージの確認のサポート。ジョン・ワトソンによる寄稿。
ワーカー:プリフェッチカウントの増分が最適化され、グループ化されるようになりました。
ワーカー:リモートコントロールコマンドキューで
consume
を2回呼び出すことはなくなりました。おそらく問題はありませんでしたが、不要でした。
内部
app.broker_connection
はapp.connection
になりましたどちらの名前も引き続き機能します。
互換性モジュールは、使用時に動的に生成されるようになりました。
これらのモジュールは、
celery.messaging
、celery.log
、celery.decorators
、およびcelery.registry
です。celery.utils
は複数のモジュールにリファクタリングされました:celery.utils.text
celery.utils.imports
celery.utils.functional
celery.utils.encoding
の代わりにkombu.utils.encoding
を使用するようになりました。モジュールの名前を
celery.routes
->celery.app.routes
に変更しました。パッケージの名前を
celery.db
->celery.backends.database
に変更しました。モジュールの名前を
celery.abstract
->celery.worker.bootsteps
に変更しました。コマンドラインドキュメントがモジュールdocstringから解析されるようになりました。
テストスイートディレクトリが再編成されました。
setup.py は、
requirements/
ディレクトリからドキュメントを読み取るようになりました。Celeryコマンドは出力をラップしなくなりました(問題#700)。
ThomasJohanssonによる寄稿。
実験的
celery.contrib.methods:メソッドのタスクデコレータ
これは、メソッドからタスクを作成するために使用できるタスクデコレータとタスクデコレータフィルタを含む実験的なモジュールです。
from celery.contrib.methods import task_method
class Counter(object):
def __init__(self):
self.value = 1
@celery.task(name='Counter.increment', filter=task_method)
def increment(self, n=1):
self.value += 1
return self.value
詳細については、celery.contrib.methods
を参照してください。
予定外の削除
通常、後方互換性のない削除は行いませんが、これらの削除による大きな影響はありません。
次の設定の名前が変更されました。
CELERYD_ETA_SCHEDULER
->CELERYD_TIMER
CELERYD_ETA_SCHEDULER_PRECISION
->CELERYD_TIMER_PRECISION
非推奨のタイムラインの変更
Celery Deprecation Time-line を参照してください。
celery.backends.pyredis
互換モジュールは削除されました。代わりに
celery.backends.redis
を使用してください!次の文書化されていないAPIが移動されました。
control.inspect.add_consumer
->@control.add_consumer()
。control.inspect.cancel_consumer
->@control.cancel_consumer()
。control.inspect.enable_events
->@control.enable_events()
。control.inspect.disable_events
->@control.disable_events()
。
このように、
inspect()
は何も変更しないコマンドにのみ使用されますが、変更を行うべき等の制御コマンドは制御オブジェクト上にあります。
修正
DatabaseError / OperationalErrorでSQLAlchemyバックエンド操作を再試行します(問題#634)
retry
を呼び出すタスクは、ackslateが有効になっている場合は確認されませんでしたDavidMarkeyによって提供された修正。
メッセージ優先度引数が昆布に正しく伝播されませんでした(問題#708)。
EranRundsteinによる修正