Celery 2.5の新機能—Pythonドキュメント
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_task
、celery.execute.apply
、およびcelery.execute.apply_async
は削除され、(当初は)2.3で削除される予定です。 - 組み込みの
ping
タスクは削除されました(当初は2.3で削除される予定です)。 代わりにpingbroadcastコマンドを使用してください。 subtask
とTaskSet
をcelery.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でデフォルトで有効になります。
暗号署名を使用した新しいセキュリティシリアライザー
メッセージの署名と検証を行う新しいシリアライザーが追加されました。
新しいシリアライザーの名前は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śによる寄稿。
celeryctl
:shell
コマンドを追加しました。シェルにはcurrent_app(
celery
)があり、すべてのタスクが自動的にローカルに追加されます。celeryctl
:migrate
コマンドを追加しました。移行コマンドは、すべてのタスクを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)で終了するようになりました。