3

Djangoプロジェクト(fromcelery==2.5.5django-celery==2.5.5)をcelery==3.0.7とに更新しましdjango-celery==3.0.6た。そして、奇妙なことが起こりました。

私が最初に気付いたのは、DjangoCelery管理インターフェースのすべての日付/時刻が3時間でオフセットされていることでした。TIME_ZONE = 'Europe/Sofia'今は何時間もかかっているのでUTC/GMT +3、問題はタイムゾーンに関係していると思います。

celerycamのログを見て、これを見つけました

UPDATE "djcelery_workerstate" SET "hostname" = 'three', "last_heartbeat" = '2012-09-18 17:57:49.000701+03:00' WHERE "djcelery_workerstate"."id" = 1 ; args=(u'three', u'2012-09-18 17:57:49.000701+03:00', 1)

last_heartbeat正しくない2012-09-18 14:57:49.000701+03:00か、2012-09-18 11:57:49.000701+00:00

一部の関数は、日時がタイムゾーンを認識しないことを期待している可能性がありますが、渡された日時は実際にはタイムゾーンを認識しています。

私の考えは、タスクが再試行されたときにのみ発生するCeleryCamログのエラーによっても確認されます。タスクにはこの@task(default_retry_delay = 30, max_retries = 60)デコレータがあります。

これはエラーです:

[2012-09-18 14:46:54,001: ERROR/MainProcess] Error in timer: ValueError('Not naive datetime (tzinfo is already set)',)
Traceback (most recent call last):
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/utils/timer2.py", line 92, in apply_entry entry()
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/utils/timer2.py", line 48, in __call__ return self.fun(*self.args, **self.kwargs)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/utils/timer2.py", line 149, in _reschedules return fun(*args, **kwargs)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/events/snapshot.py", line 71, in capture self.state.freeze_while(self.shutter, clear_after=self.clear_after)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/events/state.py", line 225, in freeze_while return fun(*args, **kwargs)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/celery/events/snapshot.py", line 68, in shutter self.on_shutter(self.state)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/django/db/transaction.py", line 209, in inner return func(*args, **kwargs)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/snapshot.py", line 139, in on_shutter self._autocommit(_handle_tasks)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/snapshot.py", line 115, in _autocommit fun()
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/snapshot.py", line 133, in _handle_tasks self.handle_task(task)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/snapshot.py", line 74, in handle_task "eta": maybe_make_aware(maybe_iso8601(task.eta)),
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/utils.py", line 74, in maybe_make_aware return make_aware(value)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/djcelery/utils.py", line 52, in make_aware value = timezone.make_aware(value, timezone.utc)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/django/utils/timezone.py", line 269, in make_aware return timezone.localize(value, is_dst=None)
  File "/opt/pythonenv/TICKETS/local/lib/python2.7/site-packages/pytz/__init__.py", line 231, in localize raise ValueError('Not naive datetime (tzinfo is already set)')
ValueError: Not naive datetime (tzinfo is already set)

Django / Celeryの更新後、すべてのデータベーステーブルを削除し、syncdbを作成しました

Djangoプロジェクトのタイムゾーン設定は次のとおりです。

TIME_ZONE = 'Europe/Sofia'
USE_TZ = True

Django/Celeryの設定は次のとおりです。

# RabbitMQ Broker
BROKER_HOST                = 'localhost'
BROKER_PORT                = 5672
BROKER_VHOST               = 'tixgate'
BROKER_USER                = 'tixgate'
BROKER_PASSWORD            = '*******'

# Redis Result Backend
CELERY_RESULT_BACKEND      = 'redis'
CELERY_REDIS_HOST          = 'localhost'
CELERY_REDIS_PORT          = 6379
CELERY_REDIS_DB            = 4
CELERY_REDIS_PASSWORD      = '*******'

CELERY_SEND_EVENTS         = True
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 1 day
CELERY_ALWAYS_EAGER        = False

CELERY_ENABLE_UTC設定もCELERY_TIMEZONE明示もしません

編集:問題はとで持続しcelery==3.0.9ますdjango-celery==3.0.9

編集:ちなみにceleryev、正しい日時が表示されます(GMTで私は推測します)

編集:PostgreSQLデータベースを使用しています

4

3 に答える 3

3

これは新しいリリースで修正される必要があるようです。一時的な回避策として、ブランチ3.0が提案されましたhttps://github.com/celery/django-celery/issues/183#issuecomment-10846821

于 2012-12-13T17:09:49.200 に答える
1

また、この問題は、あなたが(私として)取得した場合に発生する可能性があります

TIME_ZONE = 'UTC'

...

CELERY_TIMEZONE = 'Europe/Moscow'

Djangoでsettings.py。この2つの文字列は、この大きな構成settings.pyファイルのさまざまな部分に含めることができます。この場合、Celery beat(たとえば)は、タイムゾーンが変更されたことを示すメッセージを表示します。そのようなものですTimezone changed from 'UTC' to 'Europe/Moscow'が、実際に表示されるビート時間はUTCのままです。これを修正するには、正しいDjangoTIME_ZONE設定を設定するだけです。

TIME_ZONE = 'Europe/Moscow'

そしてセロリがそれを拾います!

乾杯。

于 2016-07-13T10:59:39.857 に答える
0

少なくともリリースノートによると、タイムゾーンのバグは.0.8と.0.9で修正されました。

celery3.09とdjango-celery3.0.9を使用します

于 2012-09-18T12:36:42.710 に答える