threading.Timer

相当于一个定时器。 Timer 类是 Thread 类的子类,因此可以像一个自定义线程一样工作。

  1. from threading import Timer
  2. def hello(name):
  3. print("hello,{}".format(name))
  4. # 1s 后执行
  5. Timer(1, hello, [name]).start()

apscheduler

文档
https://apscheduler.readthedocs.io/en/stable/userguide.html

  1. pip install apscheduler

interval 时间间隔
另一个 corn 文档:
https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html#module-apscheduler.triggers.cron

  1. import datetime
  2. from apscheduler.schedulers.background import BackgroundScheduler
  3. scheduler = BackgroundScheduler()
  4. @scheduler.scheduled_job('interval', minutes=1)
  5. def minutes_task():
  6. print 'haha'
  7. # 12点到21点 的每个 0 分钟到 10分钟 执行一次
  8. @scheduler.scheduled_job('corn', minute='0-10', hour='12-21')
  9. def minutes_task():
  10. print 'haha'
  11. scheduler.start()

除了 BackgroundScheduler,其他选项请参考 APScheduler 官方文档,此处简单罗列:

BlockingScheduler:当调度程序是您的进程中唯一运行的东西时使用
BackgroundScheduler:当您不使用以下任何框架时使用,并且希望调度程序在您的应用程序的后台运行
AsyncIOScheduler:如果您的应用程序使用 asyncio 模块,请使用
GeventScheduler: 如果您的应用程序使用 gevent,请使用
TornadoScheduler:如果您正在构建 Tornado 应用程序,请使用
TwistedScheduler:如果您正在构建 Twisted 应用程序,请使用
QtScheduler: 如果您正在构建 Qt 应用程序,请使用

在 django 中使用 可以放在 app 的 Config 中的 ready() 中调用

  1. class XXXConfig(AppConfig):
  2. name = 'XXX'
  3. def ready(self):
  4. from .schedulers import scheduler
  5. scheduler.start()

debug 模式下默认reload,所以启动时 可以使用

  1. python manage.py runserver --noreload

来禁止调试模式下的两次触发
PyCharm 设置:
image.png