• aspscheduler+uwsgi定时任务执行多次


    1. 问题描述

    当uwsgi设置多进程的时候,多个进程都会执行定时任务,导致同一个任务会执行多次。网上找了很多文章,大都是用数据库,或者锁的形式解决。
    感觉都不是特别好的方式,决定换一种方式来设置定时任务。
    在此记录一下,下次使用其他设置定时任务的方式。

     2. 我的实现思路

    1. 使用数据库锁(使用redis性能会更好)
        在数据建一张表:create table cron_job(id serial, job_name varchar(255))
        create index idx_job_name on cron_job(job_name)  # 不加索引后面会锁表
    
    2. 执行任务之前先去数据库获取锁
        select job_name from cron_job where job_name='你的任务名称' for update;  # job_name需要先插入到数据库,每个job的name需要用不同的name分开
        如果能获取锁,就去执行任务,没有在一定时间获取锁的进程设置超时,自动结束
        执行完成任务之后,释放锁
    3. 优化
      我们可以新加一个下次执行时间(next_exec_time)的字段,在获取到锁之后,判断该条记录的是否小于当前时间,如果小于则执行任务,如果不小于,则终止任务,等待下次时间到了之后触发。
    4. 注意,使用数据库的时候,一定要注意释放锁,不然连接一直不断开,下次执行任务就无法获取锁
  • 相关阅读:
    BZOJ
    Codeforces
    GYM
    UOJ
    Java集合之Queue
    【HIHOCODER 1478】 水陆距离(BFS)
    Java集合之Stack
    Java集合之Vector
    Java多线程入门Ⅱ
    【HIHOCODER 1604】股票价格II(堆)
  • 原文地址:https://www.cnblogs.com/JackShi/p/15054833.html
Copyright © 2020-2023  润新知