Python/Django:每 X 段时间后实时安排任务(secs/mins/hours?)
Python/Django: Schedule task in realtime after every X duration (secs/mins/hours?)
我想在我的 Django 应用程序中执行某个任务(函数),从调用它开始的指定持续时间。类似于:
... some code
async_run_func(time_interval=15_mins) # Async call. Code within the function
# should be executed after 15 mins.
... some more code
async_run_func
将在某个自定义间隔后执行。
实现此目标的正确方法是什么?一种方法是创建一个单独的线程并将其休眠 time_duration
时间段。但这会导致服务器上的线程过多。此外,如果 gunicorn 进程重新启动,状态将丢失。我希望信息持久。所以,我不想采用这种方法。目前我正在使用芹菜来执行长时间的异步和周期性任务。但是芹菜不允许在指定的持续时间后选择 运行 一次函数。
要是能在分布式系统上做就好了。例如,函数将从一个系统调用,但代码将在另一个系统上执行(使用像 RabbitMQ 这样的队列对我来说很好)。否则,我也可以在同一台机器上执行它。有什么建议吗?
Celery 有在特定时间排队的选项:
your_async_function.apply_async(args=(your, args, tuple),
kwargs={your: kwargs},
countdown=15 * 60)
或者使用子任务语法,柯里化所有参数然后延迟
your_async_function.s(your, args, tuple, your: kwargs).delay(countdown=15 * 60)
如果函数没有参数,可以跳过直接执行
your_async_function.delay(countdown=15 * 60)
ETA and Countdown are options to perform this using django-celery.
来自document:
The ETA (estimated time of arrival) lets you set a specific date and time that is the earliest time at which your task will be executed. countdown is a shortcut to set ETA by seconds into the future.
For example:
>>> result = add.apply_async((2, 2), countdown=3)
>>> result.get() # this takes at least 3 seconds to return
20
任务保证在指定日期和时间之后的某个时间执行,但不一定在那个确切时间执行。逾期的可能原因可能包括许多项目在队列中等待,或网络延迟时间长。为确保您的任务及时执行,您应该监控队列是否拥塞。
While countdown is an integer, eta must be a datetime object, specifying an exact date and time (including millisecond precision, and timezone information):
>>> from datetime import datetime, timedelta
>>> tomorrow = datetime.utcnow() + timedelta(days=1)
>>> add.apply_async((2, 2), eta=tomorrow)
使用 sched
模块怎么样?简单高效。
import sched, time
sc = sched.scheduler(time.time, time.sleep)
sc.enter(15, 1, async_run_func, ())
sc.run
我想在我的 Django 应用程序中执行某个任务(函数),从调用它开始的指定持续时间。类似于:
... some code
async_run_func(time_interval=15_mins) # Async call. Code within the function
# should be executed after 15 mins.
... some more code
async_run_func
将在某个自定义间隔后执行。
实现此目标的正确方法是什么?一种方法是创建一个单独的线程并将其休眠 time_duration
时间段。但这会导致服务器上的线程过多。此外,如果 gunicorn 进程重新启动,状态将丢失。我希望信息持久。所以,我不想采用这种方法。目前我正在使用芹菜来执行长时间的异步和周期性任务。但是芹菜不允许在指定的持续时间后选择 运行 一次函数。
要是能在分布式系统上做就好了。例如,函数将从一个系统调用,但代码将在另一个系统上执行(使用像 RabbitMQ 这样的队列对我来说很好)。否则,我也可以在同一台机器上执行它。有什么建议吗?
Celery 有在特定时间排队的选项:
your_async_function.apply_async(args=(your, args, tuple),
kwargs={your: kwargs},
countdown=15 * 60)
或者使用子任务语法,柯里化所有参数然后延迟
your_async_function.s(your, args, tuple, your: kwargs).delay(countdown=15 * 60)
如果函数没有参数,可以跳过直接执行
your_async_function.delay(countdown=15 * 60)
ETA and Countdown are options to perform this using django-celery.
来自document:
The ETA (estimated time of arrival) lets you set a specific date and time that is the earliest time at which your task will be executed. countdown is a shortcut to set ETA by seconds into the future.
For example:
>>> result = add.apply_async((2, 2), countdown=3) >>> result.get() # this takes at least 3 seconds to return 20
任务保证在指定日期和时间之后的某个时间执行,但不一定在那个确切时间执行。逾期的可能原因可能包括许多项目在队列中等待,或网络延迟时间长。为确保您的任务及时执行,您应该监控队列是否拥塞。
While countdown is an integer, eta must be a datetime object, specifying an exact date and time (including millisecond precision, and timezone information):
>>> from datetime import datetime, timedelta >>> tomorrow = datetime.utcnow() + timedelta(days=1) >>> add.apply_async((2, 2), eta=tomorrow)
使用 sched
模块怎么样?简单高效。
import sched, time
sc = sched.scheduler(time.time, time.sleep)
sc.enter(15, 1, async_run_func, ())
sc.run