如何在Django项目中设置APScheduler?

时间:2012-07-25 16:26:28

标签: python django

具体来说,如何

  • 在Django项目中设置APScheduler
  • 开始运行
  • 写信给Django ORM

2 个答案:

答案 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!")