如何在Django项目中设置APScheduler?

sam*_*ize 12 python django

具体来说,如何

  • 在Django项目中设置APScheduler
  • 开始跑步
  • 写信给Django ORM

mfi*_*tzp 15

好吧,我会去的.假设您已安装了apscheduler(或将其放在Python路径中)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()
Run Code Online (Sandbox Code Playgroud)

我怀疑你的问题是如何在Django中触发启动.你有多种选择,主要包括"把它放在一个可以运行的地方".例如,将其添加到models.py文件的底部,或者在urls.py每次Django重新启动时将其处理一次,然后继续在后台运行.然后可以在函数内正常执行数据库访问 - 只需为查询正常导入模型.

但是,请考虑如果您这样做,您将需要在您想要更改计划时终止并重新启动服务器.我也不确定如何使用多个线程(你有> 1个计时器吗?)

你可能真的想考虑使用像Celery这样的东西(通过django-celery)来获取所有这些,还有一个单独的调度守护进程,可以更好地控制调度.

  • 谢谢,创业对我来说是最有趣的一点.我在看APScheduler,因为Celery中的CrontabScheduler不支持小于分钟的分辨率,IntervalScheduler不像APScheduler那样支持start_date.这意味着开箱即可做"每隔一个星期一"和"星期一20:14:50"之类的事情.但我决定坚持使用Celery,并使用自定义调度程序.我更喜欢在Web服务器进程之外运行一个单独的进程.更容易控制和调试,IMO. (4认同)

Muy*_*kun 7

要使用这个 apscheduler,您可以使用下面的代码进行设置,您可能遇到的唯一困难是sqlalchemy建议使用 jobstore,但由于您已经有 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
  )
Run Code Online (Sandbox Code Playgroud)

我建议使用: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!")
Run Code Online (Sandbox Code Playgroud)