RT,客户端和服务端应该已经实行了 NTP 同步:
# service ntp restart
# ntpdate pool.ntp.org
9 Jan 08:28:19 ntpdate[8247]: the NTP socket is in use, exiting
Server 和 client 端的相关配置:
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
#这里标识下,CELERY_ENABLE_UTC True 和 False 都试过了,没用
本地 worker 运行时的时间:
celery -A test worker -E -l INFO -n hostA --concurrency=2
[2019-01-09 08:29:04,904: INFO/MainProcess]
server 端运行 flower 时,命令行显示的时间:
celery -A test flower --port=5555
[W 190109 08:29:04 state:122] Substantial drift from celery@test may mean clocks are out of sync. Current drift is 57600 seconds. [orig: 2019-01-09 08:29:04.870091 recv: 2019-01-10 00:29:04.931890]
然鹅,在 flower 的 web 界面上,显示我某个卡住的任务是在 57600s 后的未来接受的任务,然后就一直 starting 卡在那儿了。 后来 Ctrl+c 才开始执行,报了个 broker 超时重连,然后把这个卡住的任务跑完了,才停止。 其实这里也没搞明白为啥。
我猜测是因为这个任务开始时间超过了我任务,我的 soft_time_limit 也没有起作用。
1
arrow8899 2019-01-09 09:30:21 +08:00 1
celery 的时区 BUG 好像一直都存在,还没有修复
https://github.com/celery/django-celery-beat/issues/80#issuecomment-373615356 celery.py ``` app = Celery('test') app.now = datetime.now # 关键在这里 ``` settings.py ``` CELERY_TIMEZONE = 'Asia/Shanghai' DJANGO_CELERY_BEAT_TZ_AWARE = False CELERY_ENABLE_UTC = False TIME_ZONE = 'Asia/Shanghai' USE_TZ = False ``` |
4
fanhaipeng0403 2019-01-09 13:02:07 +08:00
设置个环境变量 export TZ = = 'Asia/Shanghai'
为啥不直接升到 4 |
5
akmonde OP @fanhaipeng0403
@arrow8899 抱歉,乌龙了,好像不是版本的原因。 我原来的是 3.1.25 ,改成了 3.1.7,先是成功了一下,后来发现 worker 好像一直 offline。 连着切了几个版本都这样,我后来又换回 3.1.25 ,莫名其妙暂时没有问题了,暂时还没跑偏。 我本来环境变量就是 shanghai,这个我确定。 我晚点再测测,还没找出啥原因。 我曾在这里测过: >>> from celery.utils.timeutils import utcoffset >>> utcoffset() worker 和 client,一个 8,一个 8,刚好是相差 57600s。 现在莫名其妙两个都变成-8 了。 |
6
akmonde OP @fanhaipeng0403
忘了回复您另一个问题,我这边需要用到 3.x 版本以上废弃的一个功能,也就是使用 test.delay()调用 chord 聚合执行,所以不能升级太高。 |
7
lolizeppelin 2019-01-09 14:17:12 +08:00
稍微读下时间获取部分源码就知道了 还能有莫名其妙的
还有, 时间同步把 ntp 服务开了不要跑 ntpdate |
8
akmonde OP @lolizeppelin Grep 了 ntpdate,进程好像后台没有跑 ntpdate,就执行了一次。
唉,紧急处理,没想到去读源码,实在心急看不下去。 |
9
lolizeppelin 2019-01-09 17:57:40 +08:00 1
ntp 服务和 ntpdate 是不同的
系统有有相关代码来调整时间的 ntpdate 是属于强制改时间的 有可能触发时间回退 导致定时器重复触发 不要用 ntpdate 来调时间!!!! python 时间本来就比较简单,怎么封装也不会复杂 随便读一下就知道 Celery 怎么获取时间的了 又不是要你去读 system call |
10
akmonde OP @lolizeppelin 受教,下次注意。
|