์ด์ด์๋ ํ์ง ์๊ฐ๋์ ๋ค๋ฅธ ์๊ฐ๋๋ก ์ฝ์์์ ์ ๋ฌ๋ฆฌ ์์ ์๋ฅผ ์คํํ๋ ค๊ณ ํฉ๋๋ค. ๋ด๊ฐ ๋ฌด์์ํ๋ ์์ ์์ ๋ก๊ทธ๋ ํญ์ ํ์ง ์๊ฐ๋ (UTC๊ฐ ์๋)๋ก ํ์๋ฉ๋๋ค. ์์ ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก UTC ์๊ฐ๋๋ก ์์ํ๋ฉด ์ ๋๋์? (CELERY_ENABLE_UTC๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ค๊ณ ๊ฐ์ ).
๊ฐ๋ฅํ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ช ๋ฌ ์ ์ ์๋ํ๋ ๊ฒ์ด ๋ง์ฐํ๊ฒ ๊ธฐ์ต๋ฉ๋๋ค. ์ด์ ์ผ๊ด ์ ์ฝ ์๊ฐ ์ ๊ฐ ํ์ฑํ ๋์๊ธฐ ๋๋ฌธ์ผ๊น์?
๋ด ์ง์ง ๋ฌธ์ ๋ ํ์ง ์๊ฐ๋ (UTC๊ฐ ์๋)๋ฅผ ์ฌ์ฉํ๋ Django ์ฑ๊ณผ Django ์ฑ ๋ด๋ถ์ ๋ช ๊ฐ์ง ์ ๋ฌ๋ฆฌ ์์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. UTC ์๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ ์ ๋ฌ๋ฆฌ ์์ ์๋ก ์ด๋ฌํ ์์ ์ ์คํํด์ผํฉ๋๋ค.
CELERY_TIMEZONE ๋ฐ CELERY_ENABLE_UTC ์ง์๋ฌธ์ ์์ ์๊ฐ ์๋ ์ ๋ฌ๋ฆฌ ๋นํธ์ ๋ํด ์๋ํฉ๋๋ค.
์ ๋ฌ๋ฆฌ์ ๋ก๊ทธ์ธ์ CELERY_ENABLE_UTC๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ํ์ด์ฌ ๋ก๊น ๋ชจ๋์ ๋ํ ๋จ์ํ ๋ํผ ์ผ๋ฟ์ ๋๋ค.
CELERY_ENABLE_UTC๋ ์ฌ๋๋ค์ด ์์ฃผ ์ค๋๋ Django ๋ฒ์ (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 ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฎ์ด ์๋๋ค.
์ด ๋ฌธ์ ๋ ์ฌ์ ํ Celery 4.0.2์ ๋จ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ค ์ถ๋ ฅ ๋ก๊ทธ์ ํ์ ์คํฌํ๋ Django์ TIME_ZONE ๋งค๊ฐ ๋ณ์์ ์ํฅ์๋ฐ์ต๋๋ค.
๋ฌธ์ # 4006์ ๊ทธ ๋ฐ๋์ ๋๋ค. @marvelph ์ด๊ฒ์ ํ์ฌ ๋ง์คํฐ์์ ์์ ๋ ์ ์์ต๋๋ค.
๋นํธ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ CELERY_TIMEZONE = 'Europe / Lisbon'๋ฐ django TIMEZONE = 'Europe / Lisbon'์ ๋ฌธ์ ๊ฐ์์์ต๋๋ค. ๋ค์ is_due์ ๋ ์ง๋ฅผ ์๋ชป ๊ณ์ฐํฉ๋๋ค.
pip ๋ฒ์ ์์ ๋๋ ๊ณ์ฐ์ด ์์ ์๊ณ ๊ทธ๊ฒ์ ์ฆ์ ์์
์ ์ฆ์ ์ ์ฌ์ผ๋ก ๋ง๋ค์๊ณ , ํ์ฌ ๋ง์คํฐ์์๋ 1h + ๋ฐ๋ณต ์๊ฐ์ผ๋ก ๊ณ์ฐํ์ต๋๋ค.
๋ ์ค์ ์ ๋ชจ๋ 'UTC'๋ก ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
# 4173์ master
๋ณํฉํ์ต๋๋ค. master
์ง์ ์ ์ฌ์ฉํ๊ณ ๋ฌธ์ ๊ฐ ๋จ์ ์๋์ง ํ์ธํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ง์คํฐ๋ก ํ
์คํธํ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ต์ ๋๊ธ์ ํ์ธํ์ธ์. https://github.com/celery/celery/issues/4041
์ต์ ๋ง์คํฐ์ ์
๋ฌ๋ฆฌ ์๊ฐ๋์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค .CELERY_TIMEZONE๊ณผ TIMEZONE์ด ๋ชจ๋ 'Europe / Lisbon'์ด๋ฉด django ์
๋ฌ๋ฆฌ ๋นํธ๊ฐ ๋ค์ ์์
์ ์ฌ๋ฐ๋ฅธ ์๊ฐ๋ณด๋ค 1 ์๊ฐ ๋ ๋ง์ด ์์ฝํฉ๋๋ค.
๋ด ํ๋ก์ ํธ์์ TIME_ZONE๊ณผ CELERY_TIMEZONE์ ๋ชจ๋ Europe / Moscow๋ก ์ค์ ํ์ง๋ง Celery beat๋ ์ฌ์ ํ UTC๋ฅผ ์ฌ์ฉํฉ๋๋ค. CELERY_ENABLE_UTC ์ค์ ์ ์ ํ ํด ๋ณด์์ง๋ง ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค. ๋ด ์์คํ ์๊ฐ์ ์ ๋ฝ / ๋ชจ์คํฌ๋ฐ์ด๊ณ ์ด๊ฒ์ ์ ๋ง ์ค๋ง ์ค๋ฝ์ต๋๋ค.
์ ๋ฌ๋ฆฌ 4.1 ๋ฐ django 1.11.x์์ ๋์ผํ ๋ฌธ์ (CELERY_TIMEZONE = TIME_ZONE = Europe / Rome)
์งํ ์ค์ ๋๋ค. ๋ ๋์ ์๋ฃจ์ ์ ์ฐพ์ผ๋ฉด ์ฌ๊ธฐ์ ์์ฑํ๊ฒ ์ต๋๋ค.
@ madEng84 Django 1.11 ๋ฐ Celery 4.1๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์์ ์ฌ ์๋๋ ์นด์ดํธ ๋ค์ด์์ ์๋ํ์ง ์๊ณ eta์์๋ง ์๋ํฉ๋๋ค.
์ด๊ฒ์ ๋๋ด ๋ณด๋ด๊ณ * ์ ๋ F์ด๋ค. ๋ชจ๋ ์ ๋ฌ๋ฆฌ๋ ์์ -> ์ ์์ ์คํํด์ผํฉ๋๋ค. ๋๋์ฒด ์์ด ๊ฐ๋ฐ์๋ค์ ๊ทธ๊ฒ์ด ์ค๊ณ๋ ๊ฒ์ ํ ์ ์์ ๋ ์๋ฌด๋ ์ ๊ฒฝ ์ฐ์ง ์๋ ์ด๊ตญ์ ์ธ ๊ธฐ๋ฅ xyz๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ๊ณ ์์ต๋๋ค! ์ด๋ฐ ์ธ์์!
CELERY_TIMEZONE = '๋ฏธ๊ตญ / ๋๋ถ'
4.1์์๋ ์์ ์ด ์์ ํ ์๋ชป๋ ์๊ฐ์ ์คํ๋๊ณ 3์์๋ ๊ด์ฐฎ ์์ต๋๋ค.
@expresspotato ์์
์ ๋ง์กฑํ์ง ์์ผ๋ฉด ๋ฌด๋ฃ๋ก ํฌํฌ ์
๋ฌ๋ฆฌ๋ก ์ด๋ํ์ญ์์ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋น์ฉ์ ์ง๋ถ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฒด ๊ถํ ๋ถ์ฌ๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋น์ ์ ๊ธ์งํ๊ธฐ ์ ์ ๋ง์ง๋ง ๊ฒฝ๊ณ ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๋ด๊ฐ ์๋ ํ์ด ๋ฌธ์ ๋ ๋ช ๋ฌ ์ ์ ๋ง์คํฐ ์์ ์์ ๋์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ํผํ๊ธฐ ์ํด ๋ฆด๋ฆฌ์ค ๋์ be55de622381816d087993f1c7f9afcf7f44ab33์ ๊ณ ์ ๋ master
๋ถ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋๋ก ์๋ํ์ต๋๋ค.
๊ทธ๋๋ ์ ์์ง ์ถ์๋์ง ์์์๊น์? ์ดํดํ ์ ์์ต๋๋ค.
@Jamim ๋ฆด๋ฆฌ์คํ๊ธฐ ์ ์ ๋ณํฉ ํ ํ ๋ฆฌํ์คํธ๊ฐ ๋ช ๊ฐ ๋ ์์ต๋๋ค. ์ด์ ํ๋ฅผ ํ์ธํ์ญ์์ค.
์๊ฐ๋๋ฅผ '์์์ / ์ํ์ด'๋ก ์ค์ ํ์ญ์์ค. ๋ฐํ์์ ์ ํํ ์๊ฐ์ ๊ณ์ฐํ์ง๋ง ์ฌ ์๋๊ฐ ํ์ฑํ๋๋ฉด ์๊ฐ ๋ค์ '+'๋ฅผ ๊ณ์ฐํ์ง ๋ง์ญ์์ค. '' 'ETA : [2018-04-19 11 : 14 : 53.216361 + 08 : 06]' '' '. ๊ณ์ฐ ์ํธ ๋ง ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ฃผ์ด์ง ์๊ฐ์ ์ด ์๋ฅผ ๋ํ ๊ฒ์ ๋๋ค. . ๊ทธ๋ ์๋ํ์ง๋ง ์๋ฒฝํ์ง ์์ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋ด ์ง์ ์ด ์ ์ฉํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฟก๋ฟก
์ด๊ฒ์ด ๋ซํ์ง ์์์ผํ๋ค๋ ๊ฒ์ ๋ช
๋ฐฑํฉ๋๋ค.
์ ๋ celery==4.1.0
๋ฐ Django==1.11.6
์์ต๋๋ค.
CELERY_TIMEZONE
๋ฐ TIMEZONE
๋ํด ์ค์ ํ ๋ด์ฉ์ ๊ด๊ณ์์ด Celery beat๋ UTC๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ์กฐํฉ True
๋ฐ False
๋ํ CELERY_ENABLE_UTC
๋ฐ USE_TZ
์ฐจ์ด๊ฐ ์๋ค.
์ฌ์ฉ์๊ฐ ์๋ํ๋ค๊ณ ์๊ฐํ๊ฒ ๋ง๋๋ ๊ฒ๋ณด๋ค์ด ๋ฒ๊ทธ๋ฅผ ์ธ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
4.2rc2๋ฅผ ์๋ํ๊ณ ๋ณด๊ณ ํ์ญ์์ค
Celery์ ์๊ฐ ์ค์ ์ด ์ด๋ป๊ฒ๋๋์ง ์ดํดํ ์ ์์ง๋ง ์์ ํ์ต๋๋ค.
base.py-> ์ง๊ธ
์ด์ ์ ํํ ์๊ฐ๋ 'Europe / London'์ ๋ํ ์ค์ ์๊ฐ์๋ณด๊ณ ํฉ๋๋ค. ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
[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์ ์ด์ด์ ๋ ผ์ ํ ์ ์์ต๋๋ค.
crontab
์์ nowfun
์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
https://stackoverflow.com/questions/21827290/celery-beat-different-time-zone-per-task
๋ด๊ฐ ์ค์ ํ์ ๋ ํญ์ UTC๋ฅผ ์ฌ์ฉํ๋ date_done
์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
cel_app.conf.timezone = 'Asia/Shanghai'
cel_app.conf.enable_utc = True
pip ๋ฐ redis์ ์ํด ์ค์น๋ v4.3.0์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@expresspotato ์์ ์ ๋ง์กฑํ์ง ์์ผ๋ฉด ๋ฌด๋ฃ๋ก ํฌํฌ ์ ๋ฌ๋ฆฌ๋ก ์ด๋ํ์ญ์์ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋น์ฉ์ ์ง๋ถ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฒด ๊ถํ ๋ถ์ฌ๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋น์ ์ ๊ธ์งํ๊ธฐ ์ ์ ๋ง์ง๋ง ๊ฒฝ๊ณ ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.