具体来说,如何
答案 0 :(得分:13)
好吧,我会去的。假设您已经安装了apscheduler(或将其放在Python路径中)basic documentation for APS列出了以下用于启动作业的代码:
from apscheduler.scheduler import Scheduler
sched = Scheduler()
@sched.interval_schedule(hours=3)
def some_job():
print "Decorated job"
sched.configure(options_from_ini_file)
sched.start()
我怀疑你的问题是如何在Django中触发启动。你有多种选择,主要包括“把它放在一个可以运行的地方”。例如,将其添加到models.py
文件的底部,或urls.py
中,并在每次Django重启时处理一次,然后继续在后台运行。然后,可以在函数内正常执行数据库访问 - 只需为查询正常导入模型。
然而,考虑到如果你这样做,你将需要杀死&每次要更改计划时重新启动服务器。我也不确定如何使用多个线程(你会有> 1个计时器?)
你真的可能想考虑使用像Celery这样的东西(通过django-celery)来获取所有这些,再加上一个单独的调度守护进程,可以更好地控制调度。
答案 1 :(得分:2)
要使用此apscheduler,您可以使用下面的代码进行设置,建议您唯一可能遇到困难的部分是使用Jobstore sqlalchemy
,但由于您已经拥有Django ORM,因此可以使用也。
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.start()
def myjob():
print('hello')
scheduler.add_job(myjob, 'cron', hour=0)
scheduler.add_job(
myjob,
'date',
id=id_value,
jobstore="default",
run_date=scheduler_date,
replace_existing=True
)
我建议使用:django-apscheduler,它已与DjangoORM的jobstore集成,并且还提供了用于管理作业的Web界面
对于django-apscheduler,您可以使用以下代码
import time
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events,
register_job
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
@register_job(scheduler, "interval", seconds=1)
def test_job():
time.sleep(4)
print("I'm a test job!")
# raise ValueError("Olala!")
register_events(scheduler)
scheduler.start()
print("Scheduler started!")