我正在服务器中使用芹菜,服务器时间现在BST,突然,我的计划任务在一小时前执行!以前,服务器时间是欧洲/伦敦,当时是格林尼治标准时间,但现在由于节省了白昼,服务器时间变成了英国夏令时(格林尼治标准时间+1)
我已将芹菜配置为使用时区,例如:
CELERY_TIMEZONE = 'Europe/London'
然后在调用任务时,我还将eta
参数的值本地化为“Europe/London”,如下所示:
from datetime import datetime
from pytz import timezone
locale_to_use = timezone('Europe/London')
current_time = locale_to_use.localize(datetime.now())
并在调用任务时使用这个current_time
作为eta
参数的值。
现在是否有任何错误,比如本地化eta
参数值?我的服务器在英国夏令时
在日间节光时区生效之前,此配置没有问题!
编辑:
为了澄清这一点,我在这里发布了我的代码示例:
@app.task(ignore_result=True)
def eta_test():
logger.info('Executing eta_test on {0}'.format(datetime.now()))
def run_eta_test(hour, minute):
now_time = datetime.now()
target_time = now_time.replace(hour=hour, minute=minute, second=0)
from settings import options
from pytz import timezone
local_zone = timezone('Europe/London')
target_time = local_zone.localize(target_time)
eta_test.apply_async(eta=target_time)
然后我从服务器中的python控制台调用run_eta_test,如下所示:
test_tasks.run_eta_test(17, 17)
即在当天17:17:00执行任务。服务器时间是17:15:45,它没有在2秒后调度它,而是立即执行任务:
[2014-04-04 17:15:45,341: INFO/MainProcess] Received task: scheduling.test_tasks.eta_test[c28448d6-3a51-42f7-9df2-cb93385ff7c6] eta:[2014-04-04 17:17:00.095001+01:00]
[2014-04-04 17:15:46,820: INFO/Worker-3] Executing eta_test on 2014-04-04 17:15:46.820316
[2014-04-04 17:15:46,820: INFO/MainProcess] Task scheduling.test_tasks.eta_test[c28448d6-3a51-42f7-9df2-cb93385ff7c6] succeeded in 0.0008487419690936804s: None
然后我再次调用该任务,在1小时零几秒后执行,调用如下:
test_tasks.run_eta_test(18, 17)
而不是将其安排在一小时几秒之后,任务只在几秒之后执行,即一小时之前:
[2014-04-04 17:16:27,703: INFO/MainProcess] Received task: scheduling.test_tasks.eta_test[f1a54d08-c12d-457f-bee8-04ca35b32242] eta:[2014-04-04 18:17:00.700327+01:00]
[2014-04-04 17:17:01,846: INFO/Worker-2] Executing eta_test on 2014-04-04 17:17:01.846561
[2014-04-04 17:17:01,847: INFO/MainProcess] Task scheduling.test_tasks.eta_test[f1a54d08-c12d-457f-bee8-04ca35b32242] succeeded in 0.0012819559779018164s: None
我的服务器日期配置为BST,如下所示:
Fri Apr 4 17:29:10 BST 2014
现在,服务器中的时区是否有问题?
再次编辑:
在回答和评论的帮助下,我无法解决这个问题。所以我做的是,使用:CELERY_ENABLE_UTC = False
,根本没有使用任何值来表示CELERY_ENABLE_UTC
。然后,我使用我的服务器时间没有任何本地化。芹菜似乎在我的服务器时间安排正确的任务。
这是芹菜4中的一个错误,我帮助解决了芹菜4.2中的问题——确实,解决方法是将芹菜的项目时区设置为UTC,但是从芹菜4.2开始,您可以再次使用任何您想要的时区,芹菜节拍调度将正常工作。原始错误报告/PR中的更多详细信息:https://github.com/celery/celery/pull/4324
我觉得奇怪的是,如果我们设置芹菜时区,它会通过将本地时间添加到utc来调整eta时间。 但是,芹菜eta时钟似乎是由utc时间触发的。 现在utc时间是时间+芹菜时区,这是错误的。
我想@bgschiller使用utc作为默认时区是解决这个问题的一种方法。。
使用此作品。。。
您可能会发现将
CELERY_TIMEZONE
设置为'UTC'
更容易。然后,如果要使用本地时间安排事件,可以执行以下操作:无可否认,这是更多的工作。本地化日期时间,然后将其转换并获取原始日期时间。不过,它应该能解决使用时区带来的大部分头痛问题。
编辑:你问,
芹菜允许您通过指定
eta
参数来延迟函数调用的执行。eta
是一个datetime
对象,表示希望运行函数的时间。CELERY_TIMEZONE
指定用于eta
的日期时间的时区。所以,如果我们设置CELERY_TIMEZONE = 'America/New_York'
,所有的eta
参数都将被解释为它们代表纽约时间。最好是设置
CELERY_TIMEZONE = 'UTC'
,并传递表示UTC时间戳的datetime对象。这避免了许多由夏令时引起的问题。更多可用信息in the docs
编辑,
请参阅asksol在评论中对eta参数的解释和更正。
相关问题 更多 >
编程相关推荐