Djangoプロジェクト(fromcelery==2.5.5
とdjango-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データベースを使用しています