Celery: CELERY_TIMEZONEとCELERY_ENABLE_UTCは効果がありません

作成日 2015年06月10日  ·  28コメント  ·  ソース: celery/celery

ローカルタイムゾーンとは異なるタイムゾーンでコンソールからセロリワーカーを実行しようとしていますが、運がありません。 私が何をしても、ワーカーのログは常にローカルタイムゾーン(UTCではありません)で表示されます。 ワーカーはデフォルトでUTCタイムゾーンで開始するべきではありませんか? (CELERY_ENABLE_UTCがデフォルトで有効になっていると仮定します)。

考えられる原因の1つは次のとおりです。これが数か月前に機能していたことを漠然と覚えているので、現在夏時間がアクティブになっていることが原因である可能性があります。

私の本当の問題は、ローカルタイムゾーン(UTCではない)を使用するDjangoアプリと、Djangoアプリ内のいくつかのセロリタスクがあることです。 UTCタイムゾーンを使用しているセロリワーカーとしてこれらのタスクを実行する必要があります。

Bug Report Major Trivial Feedback Needed ✘

最も参考になるコメント

@expresspotatoあなたが私たちが無料で行う仕事に満足していないなら、フォークセロリに行きなさい。
あなたはまたあなたの問題を解決するために私達に支払うことができます。
それ以外の場合、自己資格は歓迎されません。 私があなたを禁止する前に、これをあなたの最後の警告と考えてください。

全てのコメント28件

ディレクティブCELERY_TIMEZONEおよびCELERY_ENABLE_UTCは、ワーカーではなくセロリビートに対して機能します。

セロリへのログインでは、CELERY_ENABLE_UTCは考慮されません。これは、Pythonロギングモジュールの単純なラッパーにすぎません。

CELERY_ENABLE_UTCは、非常に古いバージョン(1.4未満)を使用している可能性があるため、デフォルトでは有効になっていません。
例を挙げていただけますか?

@thedrowただ注意してください、Django 1.4 LTSサポートが終了する10月にデフォルトでUTCを有効にする必要があります(https://www.djangoproject.com/download/)

はい、おそらく3.2.0でそれを行う必要があります。

ドキュメントを確認したところ、CELERY_ENABLE_UTCがデフォルトで有効になっていることがわかりました。したがって、このバグはロギングにのみ関連していると思います。

このタスクを完了するためのリソースがないため、これを閉じます。

マスターで修正される可能性があります。4.0リリース後に戻ってくるかどうか見てみましょう。

この議論につまずく可能性のある人への役立つメモとして、私はセロリワーカーをDjangoプロジェクト(EST)とは異なるタイムゾーン(UTC)で実行することができました。 celeryに別のDjango設定ファイル(つまり、celery_settings)を指定しました。このファイルでは、元の設定を(settings import *から)インポートしてから、TIME_ZONEパラメーターを上書きします。

この問題はCelery4.0.2でも残っているようです。
標準出力ログのタイムスタンプは、DjangoのTIME_ZONEパラメーターの影響を受けます。

問題#4006は反対を示唆しています。 @marvelphこれは現在のマスターで修正される可能性があります。

ビートスケジューラを使用して、CELERY_TIMEZONE = 'Europe / Lisbon'およびdjangoTIMEZONE = 'Europe / Lisbon'で問題が発生しました。 次のis_dueの日付が誤って計算されます。
pipバージョンでは、計算が負になり、タスクがすぐに昼食になります。現在のマスターでは、1時間以上の繰り返し時間で計算しました。
両方の設定を「UTC」に設定すると、問題が修正されます。

#4173をmasterマージしました。 masterブランチを使用して、問題が解決しないかどうかを確認できれば、すばらしいと思います。

マスターでテストしました。最新のコメントはこちらhttps://github.com/celery/celery/issues/4041をご覧ください。
CELERY_TIMEZONEとTIMEZONEの両方を「Europe / Lisbon」に設定している場合、最新のマスターのセロリタイムゾーンにはまだ問題があります。djangoセロリビートは次のタスクを正しい時間より1時間長くスケジュールします。

プロジェクトでTIME_ZONEとCELERY_TIMEZONEの両方をEurope / Moscowに設定していますが、Celerybeatは引き続きUTCを使用しています。 CELERY_ENABLE_UTC設定も切り替えてみましたが、何も変わりませんでした。 私のシステム時間はヨーロッパ/モスクワで、これは本当にイライラします

セロリ4.1とdjango1.11.xで同じ問題が発生します(CELERY_TIMEZONE = TIME_ZONE = Europe / Rome)

  • 私のperiodic_tasksは期待された時間に機能していません。 (私はそれを修正していません:/)
  • セロリのタスクを再試行すると、計算されたETAが間違っている(現在よりも少ない)ため、再試行は瞬時に行われます。 この問題については、ここ(https://github.com/celery/celery/issues/4221#issuecomment-324204504)で確認できるように、再試行したタスクに渡すetaを計算しました。

私は進行中です、私がより良い解決策を見つけたら、私はここに書きます

@ madEng84 Django1.11および

これは絶対F * INGのジョークです。 セロリがすることになっているのはタスク->時間通りにそれを実行することだけです。 なぜこれらの開発者はエキゾチックな機能xyzを追加するのに時間を浪費するのでしょうか。 聖なるがらくた!

CELERY_TIMEZONE = '米国/東部'

4.1ではタスクが完全に間違った時間に実行されましたが、3では問題ありませんでした。

@expresspotatoあなたが私たちが無料で行う仕事に満足していないなら、フォークセロリに行きなさい。
あなたはまたあなたの問題を解決するために私達に支払うことができます。
それ以外の場合、自己資格は歓迎されません。 私があなたを禁止する前に、これをあなたの最後の警告と考えてください。

私の知る限り、この問題は数か月前にマスターで修正されました。 これを回避するために、リリースの代わりにbe55de622381816d087993f1c7f9afcf7f44ab33に固定されたmasterブランチを使用しましたが、期待どおりに機能しました。
それで、なぜそれがまだリリースされていないのか、それは素晴らしい質問です。 不可解です。

@Jamimリリースする前にマージするプルリクエストがさらにいくつかあります。 マイルストーンを参照してください。

タイムゾーン「アジア/上海」を設定します。ランタイムは正しい時間を計算しますが、再試行が有効になっている場合は、「+」の遅れを計算しないでください。 このように '' 'ETA:[2018-04-19 11:14:53.216361 + 08:06]' '' '。計算シートのみを使用しません。指定された時間に秒数を追加します。 。 彼は働いていますが、完璧ではないのは何ですか?私の発言がお役に立てば幸いです。

@auvipy
これが閉じられるべきではなかったことは明らかです。

celery==4.1.0Django==1.11.6ます。

CELERY_TIMEZONETIMEZONE設定に関係なく、CelerybeatはUTCを使用します。 CELERY_ENABLE_UTCUSE_TZTrueFalse組み合わせは違いを生みません。

ユーザーにそれが機能すると思わせるよりも、このバグを認めたほうがよいでしょう。

4.2rc2を試して、報告してください

セロリの時間設定で何が起こっているのか理解できませんが、修正しました
base.py->今
そして今、それは選択されたタイムゾーン「ヨーロッパ/ロンドン」の実際の時間を報告します。ログを参照してください:

[2018-06-22 13:24:37,338: ERROR/MainProcess] <=Celery App Base=> now -> now_in_utc                      2018-06-22 12:24:37.336361+00:00
[2018-06-22 13:24:37,338: INFO/MainProcess] <=Celery App Base=> now -> self.timezone                    Europe/London
[2018-06-22 13:24:37,338: ERROR/MainProcess] <=Celery App Base=> now -> now_in_utc.astimezone(self.timezone)                            2018-06-22 13:24:37.336361+01:00
[2018-06-22 13:24:37,338: ERROR/MainProcess] <=Celery Schedules=> now -> self.app.now() 2018-06-22 13:24:37.336361+01:00
[2018-06-22 13:24:37,338: ERROR/MainProcess] <=Utils Time=> remaining -> now 2018-06-22 13:24:37.338674+01:00
[2018-06-22 13:24:42,349: ERROR/MainProcess] <=Celery Schedules=> now -> self.nowfun() 2018-06-22 13:24:42.349524+01:00

しかし、タスクはまだ生のUTCとして時間を示しています-2018-06-22 12:24:42.350384

テストの変更:

[2018-06-22 13:40:30,568: ERROR/MainProcess] <=Celery App Base=> timezone_func conf.timezone: Europe/Kiev
[2018-06-22 13:40:30,569: ERROR/MainProcess] <=Celery App Base=> timezone_func timezone.get_timezone(conf.timezone): Europe/Kiev
[2018-06-22 13:40:30,603: ERROR/MainProcess] <=Celery App Base=> now -> now_in_utc.astimezone(self.timezone) 1                          2018-06-22 15:40:30.600489+03:00
[2018-06-22 13:40:30,603: ERROR/MainProcess] <=Celery Schedules=> now -> self.app.now() 2018-06-22 15:40:30.600489+03:00
[2018-06-22 13:40:30,604: ERROR/MainProcess] <=Utils Time=> remaining -> now 2018-06-22 15:40:30.603985+03:00
[2018-06-22 13:40:30,604: ERROR/MainProcess] <=Celery Schedules=> now -> self.nowfun() 2018-06-22 15:40:30.604436+03:00

したがって、設定のタイムゾーンが有効になっているように見えますが、タスクはまだUTC時間を使用しています。

まず、これはおそらくdatetime.utcnow()ではなくdatetime.nowインスタンスである必要があります。これは、なぜすでにUTCをUTCに決定するのでしょうか。

def to_utc(dt):
    """Convert naive :class:`~datetime.datetime` to UTC."""
    return make_aware(dt, timezone.utc)

これで、ロンドンの時間をどこにでも設定できるようになりました。

<=Celery App Base=> timezone_func conf.timezone: Europe/London
<=Celery App Base=> timezone_func timezone.get_timezone(conf.timezone): Europe/London
<=Celery Schedules=> now -> self.nowfun() 2018-06-22 14:11:03.625825+01:00
<=Utils Time=> to_utc -> What is dt_utc: 2018-06-22 14:11:03.626616
<=Utils Time=> remaining -> now 2018-06-22 14:11:03.629900+01:00
<=Celery Schedules=> now -> self.nowfun() 2018-06-22 14:11:03.630299+01:00

<=Utils Time=> make_aware -> _localize(dt, is_dst=None) 2018-06-22 14:11:03.630514+00:00
<=Utils Time=> to_utc -> make_aware(dt_utc, timezone.utc): 2018-06-22 14:11:03.630514+00:00
<=Utils Time=> make_aware -> What is dt: 2018-06-22 14:11:03.630514

しかし、それでも以前に受け取ったタスクは次のとおりです。

Received | 2018-06-22 13:05:02.712443 UTC
-- | --
Sent | 2018-06-22 13:05:02.707066 UTC
Started | 2018-06-22 13:05:02.716835 UTC
Succeeded | 2018-06-22 13:05:03.029372 UTC
Retries | 0
Timestamp | 2018-06-22 13:05:03.029372 UTC

@trianglesis可能であれば、変更を加えたPRを開いてください。そこで、そこで話し合うことができます。

異なるタイムゾーンを設定するために、 crontabnowfun引数を試すことができます

https://stackoverflow.com/questions/21827290/celery-beat-different-time-zone-per-task

設定したときにdate_done常にUTCを使用するのと同じ問題があります

cel_app.conf.timezone = 'Asia/Shanghai'
cel_app.conf.enable_utc = True

pipとredisによってインストールされたv4.3.0で、問題は修正されたかどうか?

このページは役に立ちましたか?
0 / 5 - 0 評価