scheduler.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from apscheduler.schedulers.background import BackgroundScheduler
  2. from apscheduler.triggers.cron import CronTrigger
  3. _flask_app = None
  4. scheduler = BackgroundScheduler(
  5. job_defaults={"coalesce": True, "max_instances": 1},
  6. timezone="UTC",
  7. )
  8. def init_scheduler(flask_app):
  9. global _flask_app
  10. _flask_app = flask_app
  11. if not scheduler.running:
  12. scheduler.start()
  13. def _execute_job(job_id):
  14. with _flask_app.app_context():
  15. from jobs.ynh_backup import execute_job
  16. execute_job(job_id)
  17. def schedule_job(job):
  18. job_key = f"job_{job.id}"
  19. try:
  20. trigger = CronTrigger.from_crontab(job.cron_expr)
  21. except Exception:
  22. return
  23. if scheduler.get_job(job_key):
  24. scheduler.reschedule_job(job_key, trigger=trigger)
  25. else:
  26. scheduler.add_job(
  27. func=_execute_job,
  28. trigger=trigger,
  29. id=job_key,
  30. kwargs={"job_id": job.id},
  31. replace_existing=True,
  32. )
  33. def remove_job(job_id):
  34. job_key = f"job_{job_id}"
  35. if scheduler.get_job(job_key):
  36. scheduler.remove_job(job_key)
  37. def get_next_run(job_id):
  38. job_key = f"job_{job_id}"
  39. apsjob = scheduler.get_job(job_key)
  40. if apsjob and apsjob.next_run_time:
  41. return apsjob.next_run_time
  42. return None