公司项目需要,需要在之前系统的基础上开发一个定时推送系统,前后端使用cron表达式定义任务触发的时间逻辑。

后端在Django框架下使用apscheduler,刚开开始开发时使用了了django-apscheduler中提供的DjangoJobStore,默认使用了django默认自带的sqlite3 数据库,当任务比较多,并且任务间隔时间段的时候,多线程操作容易抛出:database is locked 的错误

尝试了网上常见的几个多线程操作sqlite的解决办法:

  1. 设置数据库timeout:没有解决
  2. 更改数据库权限为 666, 没有解决
  3. 自己写线程锁:水平有限,未尝试

最后采用了最原始的方法:jobstore使用了 MemoryJobStore

  1. 处理请求
  2. 操作数据库(增删改查)
  3. 配置任务(内存中)(增删改查)
    这样的话任务是在内存中运行,任务数据是存储在数据库中,好在ORM操作比较简单,没有那么复杂。