[2017-08-07 21:12:10,790: DEBUG/MainProcess] DatabaseScheduler: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ผ์ ๊ฐ์ ธ์ค๊ธฐ
[2017-08-07 21:12:10,797: DEBUG/MainProcess] ํ์ฌ ์ผ์ :
[2017-08-07 21:12:10,809: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:15,813: DEBUG/MainProcess] beat: ์ค์ผ์ค ๋๊ธฐํ ์ค...
[2017-08-07 21:12:15,813: INFO/MainProcess] ํญ๋ชฉ ์์ฑ ์ค...
[2017-08-07 21:12:15,816: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:20,818: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:25,825: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:30,831: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:35,839: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:40,844: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:45,851: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:50,854: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:12:55,860: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:13:00,862: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:13:05,870: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
^C[2017-08-07 21:13:10,245: INFO/MainProcess] ํญ๋ชฉ ์์ฑ ์ค...
[2017-08-07 21:13:10,246: INFO/MainProcess] ํญ๋ชฉ ์์ฑ ์ค...
[2017-08-07 21:18:43,339: DEBUG/MainProcess] ํ์ฌ ์ผ์ :
[2017-08-07 21:18:43,364: INFO/MainProcess] ์ค์ผ์ค๋ฌ: ๋ง๊ฐ๋ ์์
์ผ์ ๋ณด๋ด๊ธฐ (GeneBank.tasks.test)
[2017-08-07 21:18:43,376: DEBUG/MainProcess] beat: ์ค์ผ์ค ๋๊ธฐํ ์ค...
[2017-08-07 21:18:43,376: INFO/MainProcess] ํญ๋ชฉ ์์ฑ ์ค...
[2017-08-07 21:18:43,380: DEBUG/MainProcess] GeneBank.tasks.test๊ฐ ์ ์ก๋์์ต๋๋ค. ์์ด๋->9c1bdf10-0a5f-440a-98db-9eb24433a8d4
[2017-08-07 21:18:43,381: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:18:48,386: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:18:53,392: DEBUG/MainProcess] beat: 5์ด ๋ง์ ๊นจ์ฐ๊ธฐ.
[2017-08-07 21:18:58,397: DEBUG/MainProcess] beat: Wake up in 1.59์ด.
[2017-08-07 21:19:00,001: INFO/MainProcess] Scheduler: ๋ง๊ฐ๋ ์์
์ผ์ ๋ณด๋ด๊ธฐ (GeneBank.tasks.test)
๋๋ ๋ ๋ค ์ฌ์ฉํ๊ณ ์๊ณ ๊ทธ๋ค์ ์ ์๋ํฉ๋๋ค
๋ฒ์ 4.0.2์์ ๋ฒ์ 4.1.0์ผ๋ก ์ ๋ฐ์ดํธํ ํ ์ ์ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์์ ์ค์ผ์ค๋ฌ๊ฐ ์ ๋๋ก ์๋ํ์ง ์์
์ฌ๊ธฐ์๋ 4.0.2๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋ฉด ๋ค์ ์๋ํฉ๋๋ค.
์ด ๋ฒ๊ทธ๋ ์๊ฐ๋์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๊ฐ๋๋ฅผ UTC๋ก ๋ณ๊ฒฝํ๋ฉด ์๋ํฉ๋๋ค.
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = ์ฐธ
ํ์ฌ master
์ง์ ์ ๋ค์ ํ์ธํด ์ฃผ์๊ฒ ์ต๋๊น?
4.1.0์์ ์ด ๋ฒ๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ด ์ค์ ์์:
CELERY_TIMEZONE = 'Europe/Moscow'
์, ๋ค์๊ณผ ์ ์๋ํฉ๋๋ค.
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
๊ฐ์ ๋ฌธ์ -- ์ ๋ฌ๋ฆฌ ๋นํธ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ์์ง๋ง ๊ทธ ์ค ํ๋๊ฐ ์ฐ์ฐํ CELERY_TIMEZONE์ America/NewYork์ธ ํ๋ก์ ํธ ์๊ฐ๋๋ก ์ค์ ํ์ต๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก ๋๋ Rabbit QA ์๋ฒ์์ 1,800๋ง ๊ฐ์ ๋ฉ์์ง๋ก ์ ์์ ๊นผ์ต๋๋ค. ์์ ์๊ฐ ๋๊ธฐ์ด์ ์ถ๊ฐ๋๋ ์๋(๋ถ๋น ์๋ฐฑ ๊ฐ)๋ฅผ ๋ฐ๋ผ์ก์ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค์ ์ ์ญ์ ํ๊ณ ํ๋ก์ ํธ ๊ธฐ๋ณธ๊ฐ์ ์์์ CELERY_TIMEZONE์ผ๋ก ์ค์ ํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
FWIW -- ๋๋ ์ฐ๋ฆฌ๊ฐ DatabaseScheduler๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ฌธ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ ๊น์?
@matteius @AyumuKasuga master
๋ถ๊ธฐ๋ก ํ
์คํธ๋ฅผ ์คํํ์ฌ ์์ ์ฌํญ์ ํ์ธํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๋ฌธ์ ์ ๋ํด ์ฃ์กํฉ๋๋ค.
์๋
ํ์ธ์ @georgepsarakis์
๋๋ค !
๋ฐฉ๊ธ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ํ
์คํธํ๋๋ฐ ๋ถํํ๋ ๋ด ์ค์ ์์ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง!
์๋ ํ์ธ์,
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html ์ django-celery-beat ์ค์ ์ง์นจ์ ๋ฐ๋์ต๋๋ค.
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
๊ทธ๋ฐ ๋ค์ ์ฃผ๊ธฐ์ ์์ ์ ์ ์ํฉ๋๋ค.
@periodic_task(run_every=timedelta(seconds=30))
def do_stuff():
print("HI")
์ ๋ฌ๋ฆฌ ๋นํธ๋ฅผ ์์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
$> DJANGO_SETTINGS_MODULE="proj.settings.dev" celery -A proj beat -l info
celery beat v4.1.0 (latentcall) is starting.
__ - ... __ - _
LocalTime -> 2017-08-28 15:58:44
Configuration ->
. broker -> amqp://guest:**<strong i="14">@localhost</strong>:5672//
. loader -> celery.loaders.app.AppLoader
. scheduler -> django_celery_beat.schedulers.DatabaseScheduler
. logfile -> [stderr]@%INFO
. maxinterval -> 5.00 seconds (5s)
[2017-08-28 15:58:44,425: INFO/MainProcess] Writing entries...
[2017-08-28 15:58:45,629: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[2017-08-28 15:58:45,630: INFO/MainProcess] Writing entries...
์ฃผ๊ธฐ์ ์์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ฉฐ enabled
๋ก ํ์๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ฌ๋ฆฌ ์์ ์๋ ์ฃผ๊ธฐ์ ์ธ ์์ ์ ์์ ํ๊ฑฐ๋ ์คํํ์ง ์์ต๋๋ค.
$> DJANGO_SETTINGS_MODULE="proj.settings.dev" celery -A proj worker -l info -E
-------------- celery@proj-dev v4.0.2 (latentcall)
---- **** -----
--- * *** * -- Linux-4.4.0-83-generic-x86_64-with-Ubuntu-16.04-xenial 2017-08-28 15:57:42
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: proj:0x7f89f78faeb8
- ** ---------- .> transport: amqp://guest:**<strong i="20">@localhost</strong>:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: ON
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. proj.tasks.do_nothgin
. proj.tasks.do_stuff
[2017-08-28 15:57:42,269: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-08-28 15:57:42,287: INFO/MainProcess] mingle: searching for neighbors
[2017-08-28 15:57:43,324: INFO/MainProcess] mingle: all alone
์ํํธ์จ์ด:
celery==4.1.0
django-celery-beat==1.0.1
django-celery-results==1.0.1
Django==1.8.2
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด/๋์์ ํ์ํฉ๋๋ค.
์ต์์,
์ธ๋ฐ์ค์ฐฌ
๋ฅ๋ฉ์ด๋ฆฌ. ์๋ํ์ง ์์ต๋๋ค.
@mchen-scala ์ ๋ OSS ํ๋ก์ ํธ๊ฐ ํ๋ ฅ์ ์ด๊ณ ๊ฐ๊ด์ ์ด๊ณ ๊ฑด์ค์ ์ธ ๋นํ๊ฐ๋ฅผ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ช ์ค์ ์ฝ๋๋ฅผ ๋ฅ ์กฐ๊ฐ์ ๋ฃ์์ต๋๊น? ์ค์ ๋ก ๋นํธ๊ฐ ์๋ Celery๊ฐ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
๋๋ ๋น์ ์ด ์ง๊ธ๊น์ง ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ง๋ณด๋ ์์คํ ์ ๊ตฌ์ถํ์ต๋๋ค. ์ ๋ ์ด์ ์ฒด์ ๋ฅผ ์์ฑํ๊ณ ๋น๋๊ฐ ๋์ ๊ฑฐ๋ ํ๋ซํผ๊ณผ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ผํฐ ๊ฐ DB๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ง์.
์ฝ๋ ์ค? ๋๋ ์๋ํ๋ ์์คํ ๋ง ๋ด ๋๋ค. LOC๋ tyros๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
์ ๊ฐ ๋ฌผ๋ ค๋ฐ์ ์์คํ ์ด Celery๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Celery๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์์ ๊ณ ์ฐ๋ฆฌ๊ฐ ์ฒซ ๋ฒ์งธ ๋ฐฐ๋ฌ์ ๋ง์น๋ฉด ๋ด ์์ ์ ์ธ ๊ฒ์ ๋๋ค.
๋นํธ ๋ฌธ์ ์ธ์๋ ์์ ์คํ์์ ์ต๋ ํ ๋ฒ ์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ธ์ ์ฌ์ฉํ๋๋ก ์ฌ๋๋ค์๊ฒ ์์ฒญํ๋ ๊ฒ์ ์์ฒญ๋ ๋๋ด์ ๋๋ค.
๋น์ ์ ๊ณ ์๊ธ ์ง์ ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ OSS์ธ ๋น์ ์ด ์ํ๋ ๊ฒ์ ์ถฉ์คํ์ญ์์ค.
@mchen-scala ๋น์ ์ ์ด๋ฉด์ ๋ณต์กํ ์์คํ ์ ์์ฑํ ์ ์ด ์์ผ๋ฉฐ ์ด ํฐ์ผ์ ๋งฅ๋ฝ์กฐ์ฐจ ์ดํดํ ์ ์์ต๋๋ค. ์ฆ, Celery 4 ์๋ฆฌ์ฆ์๋ ์๊ฐ๋๊ฐ UTC๊ฐ ์๋ ๊ฒฝ์ฐ CELERY_BEAT_SCHEDULE๋ฅผ ๋ฐ๋ฅด์ง ์๋ ์ผ๋ถ ๋ฒ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทํ์ ์์ ์ ์ฌ๋ฌ ์์ค์์ ๋ชจ๋ ๋ถ์ ํํ๊ณ ๋ชจ์์ ์ ๋๋ค. ๋๋ด์ ๋น์ ์ด ์ฌ๋ฌ ์ฐ์ ์ ๊ฑธ์ณ ๋ง์ ์ฌ๋๋ค์ ์๊ตฌ์ ๋ง๋ OSS ํ๋ก์ ํธ์ ๋ํด ์ฐ๋ฆฌ๋ฅผ ๋ชจ์ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ๋น์ ์ด ๊ณ ์ฉ์ฃผ๋ฅผ ์ํด ์์ฑํ ๋ชจ๋ ๊ฒ์ด Celery ํ๋ก์ ํธ๋งํผ ๋ง์ ๋น์ ๋ณด์ง ๋ชปํ๋ค๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ์ด์ ์์ ์ ์ฐธ์กฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์์ผ ์ธ๊ณ์์๋ 2-4์ฃผ๋ง๋ค ๋ฆด๋ฆฌ์คํ ๊ฒ์ด๋ฏ๋ก, ๋น์ ์ด ๊ตฌ์ถํ๋ค๊ณ ์๊ฐ๋๋ ์ด ๋ฉ์ง ์์คํ ๋์ ์์๋ฐ์ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค๋ ์ฌ์ค์ ๋น์ ์ด ๋ถํ๋ ค์ง ์๊ธฐ ๊ฐ์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋์๊ฒ ๋ํ๋ ๋๋ค.
๋ํ mchen-scala, ์ ๋ฌ๋ฆฌ๋ฅผ ๋๋๋ก ๊ถ์ฅํฉ๋๋ค. ์ฃผ๋ก ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์์ ๋น์ ์ ํ๋๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ OSS๋ฅผ ํ์ฉํ๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ง์์ ์ ๊ณตํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ ๋น์ ์ด ์์ ์ ๋งํธ๋ผ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ ์ด ์ํ๋ ๊ฒ์ ์ถฉ์คํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด๋ ๋ถ๋ช ํ ๊ธฐ์กด ์๋ฃจ์ ์ ๋ฌธ์ ์ ๋ํ ์์ ์ ์๋ฃจ์ ์ ๋กค๋งํ๊ณ ๋๋จธ์ง ์ฐ๋ฆฌ์๊ฒ ๋ฐ์ฌํ์ ๋ฐ๋ณด๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ์์!
๋๋ ์ค์ ์๊ฐ๋ ์คํ์
์ด ์๋๋ผ๊ณ ํ์ ํ๋ ์คํ์
+20์์ ์ด๋ฏธ ์๊ฐ๋๋ฅผ ์ธ์ํ๊ณ ์๋ ๋ ์ง ์๊ฐ์ ๋ฏธ๋ ๋ ์ง ์๊ฐ์ผ๋ก ๋ณํํ๋ ์ ํํ ์ฝ๋ ๋ผ์ธ์ ์ง์ ํ์ต๋๋ค.
2017-10-11 22:42:27.041931-04:00์ ๋ด Pull Request์ ๋ผ์ธ์์ 2017-10-12 22:42:27.041931+20:00์ผ๋ก ๋ณํ๋ฉ๋๋ค.
๋ถ๋ช
ํ UTC ๋ชจ๋์์ datetime ๊ฐ์ฒด๋ ์ฝ๋์ ์ด ์์ ์์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์์ ์ผ์ด๋๋ ์ผ์ ๋๋จธ์ง_๋ธํ์ ๊ฒฐ๊ณผ๊ฐ -1์ผ, 1:27:32.958069 ์์
์ผ์ ๋ณด๋ค ๋ฆ์ ๊ฒ์ผ๋ก ํด์๋๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ์์
์ ๋ณด๋ด๊ณ ํญ์ ๋ค์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ์์ง ์์ต๋๋ค. ์์
๋ง๊ฐ์ผ๊น์ง ํญ์ -1์ผ์ด๊ธฐ ๋๋ฌธ์ ์์
์ ๊ณ์ํด์ ์ด๊ณผํฉ๋๋ค.
๋ด PR์ด ์ค์ ์ค๋๋ ์ฝ๋ ์ค์ ์ฃผ์์ ๋ฌ๊ณ ์์์ ์ธ์ ํ์ง๋ง ๋ชจ๋ ๋จ์ ํ ์คํธ๋ ํต๊ณผํ ๊ฒ์ฒ๋ผ ๋ณด์๊ณ ๋ด ํ ์คํธ์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ํ๋ ฅ์ ํผ๋๋ฐฑ์์ ์ฐพ๊ณ ์์ต๋๋ค.
์ ๋ ์ด๊ฒ์ด Python 2.7๊ณผ Python 3.5 ๋ฐ 3.6 ๋ฒ์ ์์ ๋ฌธ์ ์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋ค๋ฅธ ๋ฒ์ ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๋ด๊ฐ ํ๊ฒฝ์ ์ค์ ํ ๋ฒ์ ์ผ ๋ฟ์ ๋๋ค.
๋๋ ๋นํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ django-celery-beat๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๊ณ ํ์ต๋๋ค ... ํ๋ฃจ๋ ์ฃผ๋ก github ๋ฌธ์ ๋ฅผ ์ฝ์์ต๋๋ค :(
CELERY_TIMEZONE = 'UTC'
์ฌ์ฉํ ๋ ์๋ํ์ง ์๋ ๋ค๋ฅธ ์ฌ๋์ด ์์ต๋๊น? ์ ์ธํธ๋ก ํ๋๊ฒ๋ ๋ฌธ์ ์ธ๋ฐ..
@xeor CELERY_ENABLE_UTC = True๋ก ์ค์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
localize()๋ก ์ ๋ฌ๋๋ datetime์ ์ค์ ๋ฌธ์ ๋ ํ๋ก์ ํธ์ ๋ํด UTC๊ฐ ์๋ ์ง์ญ ์๊ฐ๋๊ฐ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ ํด๋น datetime์ด ์ด๋ฏธ localize๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ด ์ ํํ๊ณ dt = dt.astimezone(tz)์ด ์ด๋ฅผ a๋ก ๋ณํํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฏธ๊ฐ ์๋ ์๊ฐ๋๊ฐ ํฌํจ๋ ๋ฌด์๋ฏธํ ๋ฏธ๋ ๋ ์ง/์๊ฐ์ ๋๋ค.
@xeor ๋ค์ ์ค์ ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
์ด์ ์ด๋ฆฌ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง Celery์ django-celery-beat๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๊ณ ์ต์ ๋ฒ์ ์ผ๋ก ๋ค์ ์ค์นํ๋๋ฐ ์๋ํ์ต๋๋ค.
๊ณ ๋ง์.. ๋๋ ์ด์์ด ๊ทธ 3 ๊ฐ ๋ชจ๋๋ก ์๋ํ์ต๋๋ค.
๋์ค์ ๊นจ๋ํ ํ๊ฒฝ์ผ๋ก ๋ฆฌ๋น๋ํด์ ํด๋ด์ผ๊ฒ ์ต๋๋ค..
@xeor ๊ธ์, ์ด ๋ฌธ์ ๊ฐ ๋น์ ์ด ๊ฒช๊ณ ์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด ํฐ์ผ์ ์กฐ์ธ์ ์ง๊ธ๊น์ง ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด์ ์ด๋ฉฐ, ์ด๋ก ์ธํด ์์ฝ๋ ์์ ์ ์ ์ดํ ์ ์๋ ๋๊ธฐ์ด์ ๋ฃ๊ณ ์์ ์ด ์์ด๊ณ ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ์ค๋ฅ ๋๋ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ์ ๋ํด ๋ง์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋จ๊ธฐ์ง ์์ ๊ฒ์ฒ๋ผ ํน์ ๋ฌธ์ ๋ฅผ ๋ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๊น?
ํญ์ ๊ธฐ์๊ฒ ๋์๋๋ฆฝ๋๋ค. DatabaseScheduler ์์ด ์ด ๋ฌธ์ ๊ฐ ์์๊ณ ์๊ฐ๋๋ง ๋ณ๊ฒฝํ์ฌ ์์ ํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ๋ด ํ ์คํธ์์ ์ด ๋ฒ๊ทธ ์ด์ ๊ณผ ์ดํ์ ์์ฑ๋ ์ผ์ ํ์ผ์ด ๋์ผํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ๊ฐ ์ค์ผ์ค๋ฌ์ ๊ดํ ๊ฒ์ด ์๋๋ผ localize() ํธ์ถ๋ก ์ ๋ฌ๋๋ ๋ ์ง ์๊ฐ ์ ํ์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฏธ๋ฆฌ ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์๋ง ๋ค์ ์ฃผ ๋ง์ด๋ ๊ทธ ๋ค์ ์ฃผ ์ ์ ๋ ๊น์ ๋ฃจํ๋ฅผ ์ก์ ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ ๋์ ์ด ์ค๋ ๋์ ์งํ ์ํฉ์ ๋ํด ๊ณ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ด ์ค์ ์ด ํน๋ณํ์ง ํ์คํ์ง ์์ง๋ง docker, amqp, rabbitmq ๋ฐ ๋ชจ๋ ์ต์ ๋ฒ์ ์ celery python ํจํค์ง(rabbitmq๊ฐ ์๋)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ์ธํ ์ ์์ต๋๋ค)..
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋๋ก celery-beat๊ฐ ์๋ํ์ง ์์ต๋๋ค(์ค๊ฐ์
์ฒด์ ์์
์ ๋ณด๋ด์ง ์์). ๋ํ 59๋ถ๋ง๋ค ๋๋ฌด ๋ง์ ์์
์ ๋ณด๋
๋๋ค.
1๋ถ๋ง๋ค ์คํ๋๋ ํ
์คํธ ์์
์ ๋ง๋ค์์ต๋๋ค.
[2017-11-09 20:52:00,052: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:53:00,049: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:54:00,019: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:55:00,027: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:56:00,049: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:57:00,004: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:58:00,045: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:00,032: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:00,035: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:00,037: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:00,044: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
...
[2017-11-09 20:59:59,977: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,979: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,981: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,986: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,989: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,994: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 20:59:59,997: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 21:00:00,000: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 21:01:00,047: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 21:02:00,047: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
[2017-11-09 21:03:00,053: INFO/MainProcess] Scheduler: Sending due task test-task (tasks.test.test_task)
59๋ถ์ ์ฌ๋ฌ ์์
์ด ์คํ๋๊ธฐ ์์ํ๊ณ ์๊ฐ์ด 0๋ถ์ ๋๋ฌํ๋ฉด ์์๋๋ก ๋ค์ ์คํ๋ฉ๋๋ค.
์ด ๋ฒ๊ทธ์ ๋ํ ๋จ์๊ฐ ์์ต๋๋ค..?
์ด๊ฒ์ ์ ๋ฌ๋ฆฌ 4.1.0์ ์ค์ ์ ๋๋ค.
timezone = 'Asia/Seoul'
enable_utc = False
์ผ์ ์ ํ์ผ db๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
python 3.6.3, pytz 2017.3, django 1.11.7, celery 4.1.0 ๋ฐ django-celery-beat 1.1.0์์๋ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์๋๋ค.
#update django_celery_beat_periodictask set last_run_at = NULL;
#select name, last_run_at from django_celery_beat_periodictask;
name | last_run_at
--------------------------+-------------------------------
celery.backend_cleanup |
> pipenv run celery beat -A appname -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler
Loading .env environment variablesโฆ
celery beat v4.1.0 (latentcall) is starting.
__ - ... __ - _
LocalTime -> 2017-11-30 08:28:58
Configuration ->
. broker -> amqp://guest:**<strong i="9">@localhost</strong>:5672//
. loader -> celery.loaders.app.AppLoader
. scheduler -> django_celery_beat.schedulers.DatabaseScheduler
. logfile -> [stderr]@%DEBUG
. maxinterval -> 5.00 seconds (5s)
[2017-11-30 08:28:58,945: DEBUG/MainProcess] Setting default socket timeout to 30
[2017-11-30 08:28:58,946: INFO/MainProcess] beat: Starting...
[2017-11-30 08:28:58,946: DEBUG/MainProcess] DatabaseScheduler: initial read
[2017-11-30 08:28:58,946: INFO/MainProcess] Writing entries...
[2017-11-30 08:28:58,968: DEBUG/MainProcess] DatabaseScheduler: Fetching database schedule
[2017-11-30 08:28:59,068: DEBUG/MainProcess] Current schedule:
<ModelEntry: celery.backend_cleanup celery.backend_cleanup(*[], **{}) <crontab: 0 4 * * * (m/h/d/dM/MY)>>
[2017-11-30 08:28:59,115: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[2017-11-30 08:28:59,115: INFO/MainProcess] Writing entries...
[2017-11-30 08:28:59,115: DEBUG/MainProcess] DatabaseScheduler: Fetching database schedule
[2017-11-30 08:28:59,121: DEBUG/MainProcess] Current schedule:
<ModelEntry: celery.backend_cleanup celery.backend_cleanup(*[], **{}) <crontab: 0 4 * * * (m/h/d/dM/MY)>>
[2017-11-30 08:28:59,122: DEBUG/MainProcess] beat: Ticking with max interval->5.00 seconds
[2017-11-30 08:28:59,138: DEBUG/MainProcess] Start from server, version: 0.9, properties: {'capabilities': {'publisher_confirms': True, 'exchange_exchange_bindings': True, 'basic.nack': True, 'consumer_cancel_notify': True, 'connection.blocked': True, 'consumer_priorities': True, 'authentication_failure_close': True, 'per_consumer_qos': True, 'direct_reply_to': True}, 'cluster_name': 'rabbit<strong i="10">@Jupiter</strong>', 'copyright': 'Copyright (C) 2007-2017 Pivotal Software, Inc.', 'information': 'Licensed under the MPL. See http://www.rabbitmq.com/', 'platform': 'Erlang/OTP 20.1', 'product': 'RabbitMQ', 'version': '3.6.14'}, mechanisms: [b'AMQPLAIN', b'PLAIN'], locales: ['en_US']
[2017-11-30 08:28:59,152: DEBUG/MainProcess] using channel_id: 1
[2017-11-30 08:28:59,153: DEBUG/MainProcess] Channel open
[2017-11-30 08:28:59,154: DEBUG/MainProcess] beat: Synchronizing schedule...
[2017-11-30 08:28:59,155: INFO/MainProcess] Writing entries...
[2017-11-30 08:28:59,160: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,161: DEBUG/MainProcess] celery.backend_cleanup sent. id->1dd626be-1dea-43ec-b000-ab61fdd33f9d
[2017-11-30 08:28:59,163: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,163: DEBUG/MainProcess] celery.backend_cleanup sent. id->7a9c7d44-e570-4a5a-9803-0a8e5111f035
[2017-11-30 08:28:59,165: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,166: DEBUG/MainProcess] celery.backend_cleanup sent. id->114ee8e1-4b3c-4f43-a632-9a249d7db364
[2017-11-30 08:28:59,167: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,168: DEBUG/MainProcess] celery.backend_cleanup sent. id->5b7f3825-d6c8-43a5-b056-2d567ec2c4df
[2017-11-30 08:28:59,170: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,171: DEBUG/MainProcess] celery.backend_cleanup sent. id->f1bfb936-0dd1-47b6-be10-3763d4446758
[2017-11-30 08:28:59,172: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,173: DEBUG/MainProcess] celery.backend_cleanup sent. id->7a12f2da-3717-45ab-b018-6b4fd7b83982
[2017-11-30 08:28:59,175: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,175: DEBUG/MainProcess] celery.backend_cleanup sent. id->64fbd61d-e80e-4a32-a49d-31ddc7e155c7
[2017-11-30 08:28:59,177: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,179: DEBUG/MainProcess] celery.backend_cleanup sent. id->ff38e88e-e7e8-4436-9724-9c416dde4d72
[2017-11-30 08:28:59,181: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
[2017-11-30 08:28:59,181: DEBUG/MainProcess] celery.backend_cleanup sent. id->d5116c47-df14-4f3e-a4d1-09087cd1af80
[2017-11-30 08:28:59,183: INFO/MainProcess] Scheduler: Sending due task celery.backend_cleanup (celery.backend_cleanup)
...
๊ทธ๋ฆฌ๊ณ ๋๊ธฐ์ด์ 600/์ด์ ์๋๋ก ๊ณ์ ์ฑ์์ง๋๋ค.
# select name, last_run_at from django_celery_beat_periodictask;
name | last_run_at
--------------------------+-------------------------------
celery.backend_cleanup | 2017-11-30 16:40:59.352453-08
๋ด ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(๋ฌธ์๊ฐ ์ฌ๋ฌ ๊ณณ์์ ๋งค์ฐ ๋ถ๋ถ๋ช ํ๊ณ ๊ตฌ์์ด๊ธฐ ๋๋ฌธ์ ์ฐพ์ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์ค์ ํ์ต๋๋ค):
settings.py
CELERY_TIMEZONE = 'Canada/Pacific'
CELERY_ENABLE_UTC=False
USE_TZ = True
TIME_ZONE = 'Canada/Pacific'
celery.py
app = Celery('MyApp')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.timezone = 'Canada/Pacific'
app.conf.enable_utc = False
๋ฐ๋ผ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง๋ ์ ๋ฌ๋ฆฌ๊ฐ 08:28:59-08์ ์์ ์ ์คํํ์ง๋ง last_run_time์ ์ ์ฅํ ๋ ์ ์ฅํ๊ธฐ ์ ์ 16:28:59-08์ ์ป๋ ๋ฐ ์ฌ์ ํ 8์๊ฐ์ด ์ถ๊ฐ๋๋ค๋ ๊ฒ์ ๋๋ค. DB.
schedules.py๋ฅผ ๊ฐ๋จํ ์ดํด๋ณด๋ฉด crontab.is_due()์์ timedelta ๋๋ #์ด๋ฅผ ๋ฐํํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๊ณ์ ํ๊ณ ๋ค ์๊ฐ์ด ์์ง๋ง ๋ถ๋ช
ํ crontab ํด๋์ค ๋ด๋ถ์ ๋ฌด์ธ๊ฐ๊ฐ ํ์ฌ ์๊ฐ๊ณผ ํ์ฌ ์๊ฐ ์ฌ์ด์ tz replaced
(๋ณํ๋์ง ์์)๋ฅผ ์ฌ์ฉํ์ฌ timedelta๋ฅผ ์ป๊ณ ์์ต๋๋ค.
๋๋ replace
์๊ฐ๋์ ๋ผ์ธ์ ๋งค์ฐ ์์ฌํ ๊ฒ์
๋๋ค.
์๊ฒ ์ต๋๋ค -- ์ด ๋ฒ๊ทธ๊ฐ ์๋ ๋ชจ๋ ์ฌ๋์ด ๋ง์คํฐ๋ฅผ ๋ณต์ ํ๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ๋ค์ ํ ์คํธํ ์ ์๋ค๋ฉด. ์ง๋ ๋ฐค์ ์ PR์ด ๋ณํฉ๋์๊ณ ๋ฒ๊ทธ๊ฐ ์์ ๋์์์ ๋ฐฉ๊ธ ํ์ธํ์ง๋ง DB ์ค์ผ์ค๋ฌ ๋๋ ๊ธฐํ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํด ์ถ๊ฐ ํ์ธ์ ๋ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ์ฌ ํด์!
976515108a4357397a3821332e944bb85550dfa2 ์ด๊ฒ์ ์ ์ฉํ๊ณ ํ์ธ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@mchen-scala ๋น์ ์ ์ด๋ฉด์ ๋ณต์กํ ์์คํ ์ ์์ฑํ ์ ์ด ์์ผ๋ฉฐ ์ด ํฐ์ผ์ ๋งฅ๋ฝ์กฐ์ฐจ ์ดํดํ ์ ์์ต๋๋ค. ์ฆ, Celery 4 ์๋ฆฌ์ฆ์๋ ์๊ฐ๋๊ฐ UTC๊ฐ ์๋ ๊ฒฝ์ฐ CELERY_BEAT_SCHEDULE๋ฅผ ๋ฐ๋ฅด์ง ์๋ ์ผ๋ถ ๋ฒ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทํ์ ์์ ์ ์ฌ๋ฌ ์์ค์์ ๋ชจ๋ ๋ถ์ ํํ๊ณ ๋ชจ์์ ์ ๋๋ค. ๋๋ด์ ๋น์ ์ด ์ฌ๋ฌ ์ฐ์ ์ ๊ฑธ์ณ ๋ง์ ์ฌ๋๋ค์ ์๊ตฌ์ ๋ง๋ OSS ํ๋ก์ ํธ์ ๋ํด ์ฐ๋ฆฌ๋ฅผ ๋ชจ์ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ๋น์ ์ด ๊ณ ์ฉ์ฃผ๋ฅผ ์ํด ์์ฑํ ๋ชจ๋ ๊ฒ์ด Celery ํ๋ก์ ํธ๋งํผ ๋ง์ ๋น์ ๋ณด์ง ๋ชปํ๋ค๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ์ด์ ์์ ์ ์ฐธ์กฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์์ผ ์ธ๊ณ์์๋ 2-4์ฃผ๋ง๋ค ๋ฆด๋ฆฌ์คํ ๊ฒ์ด๋ฏ๋ก, ๋น์ ์ด ๊ตฌ์ถํ๋ค๊ณ ์๊ฐ๋๋ ์ด ๋ฉ์ง ์์คํ ๋์ ์์๋ฐ์ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค๋ ์ฌ์ค์ ๋น์ ์ด ๋ถํ๋ ค์ง ์๊ธฐ ๊ฐ์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋์๊ฒ ๋ํ๋ ๋๋ค.
๋ํ mchen-scala, ์ ๋ฌ๋ฆฌ๋ฅผ ๋๋๋ก ๊ถ์ฅํฉ๋๋ค. ์ฃผ๋ก ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์์ ๋น์ ์ ํ๋๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ OSS๋ฅผ ํ์ฉํ๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ง์์ ์ ๊ณตํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ ๋น์ ์ด ์์ ์ ๋งํธ๋ผ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ ์ด ์ํ๋ ๊ฒ์ ์ถฉ์คํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด๋ ๋ถ๋ช ํ ๊ธฐ์กด ์๋ฃจ์ ์ ๋ฌธ์ ์ ๋ํ ์์ ์ ์๋ฃจ์ ์ ๋กค๋งํ๊ณ ๋๋จธ์ง ์ฐ๋ฆฌ์๊ฒ ๋ฐ์ฌํ์ ๋ฐ๋ณด๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ์์!