虽然celery-beat更老牌.但是实际用下来故障更多一些.我一般会用scheduler
APScheduler==3.6.3

文档

https://apscheduler.readthedocs.io/en/3.x/

使用

这里使用django的自定义命令来启动定时任务(可以方便的使用django的orm),并使用supervisor管理.
app/management/commands/sysscheduler.py←最后的文件名就是你的自定义命令名.前面的app可以是项目中的任意一个app.

  1. from apscheduler.schedulers.background import BlockingScheduler
  2. from apps.account.scheduler.sync_user import sync_users # 这里的函数是你要执行的定时任务
  3. from apps.host.task import sync_ssh
  4. class Command(BaseCommand):
  5. def handle(self, *args, **options):
  6. scheduler = BlockingScheduler(
  7. executors={
  8. 'default': ThreadPoolExecutor(20),
  9. 'processpool': ProcessPoolExecutor(20)
  10. },
  11. job_defaults={
  12. 'coalesce': False,
  13. 'max_instances': 20
  14. }
  15. )
  16. # 计划任务
  17. scheduler.add_job(sync_users, 'cron', hour='1', id='sync_users_cron', max_instances=1)
  18. # 周期任务
  19. scheduler.add_job(sync_ssh, 'interval', hours=4, id='sync_ssh', max_instances=1)
  20. scheduler.start()

对应的supervisor配置文件

  1. [program:spug-scheduler]
  2. directory = /opt/project #django项目的根目录
  3. command = /opt/venv/bin/python manage.py sysscheduler
  4. autostart = true
  5. stdout_logfile = /var/log/spug-scheduler.log
  6. redirect_stderr = true
  7. environment=DJANGO_RUN_MODE="PROD"