Python----schedule模块关于定时任务的高级用法一

【原文链接】

1 取消定时任务

比如当满足一定条件时,就取消定时任务,在这种场景下,不可能说把进程干掉,所以可以利用取消定时任务的功能

如下代码,通过count控制当执行了5此以后,就取消定时任务

import schedule
import time

count=0
def do_func(name,age):
    global count
    count+=1
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))


def main():
    job=schedule.every(2).seconds.do(do_func,"张三丰",100)

    while True:
        if count>=5:
            schedule.cancel_job(job)
        schedule.run_pending()


if __name__=="__main__":
    main()

执行结果如下,可以看到当执行完5此打印后,进程并没有退出,但是定时任务不再执行了

2022-05-25 00:03:15 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:03:17 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:03:19 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:03:21 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:03:23 in do func : 姓名:张三丰 年龄:100

2 定时任务只执行一次

定时任务执行一次似乎是没啥意义的,但是在某些场景下,比如执行了一定次数后,当满足一定条件时只需要再执行一次,这个时候就派上用场了

如下为单纯的只执行一次的定时任务

import time

def do_func(name,age):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))
    return schedule.CancelJob


def main():
    schedule.every(2).seconds.do(do_func,"张三丰",100)
    while True:
        schedule.run_pending()


if __name__=="__main__":
    main()

执行结果如下,可以发现,执行完一次就不再执行了

2022-05-25 00:14:20 in do func : 姓名:张三丰 年龄:100

执行一次的定时任务的原理其实是在任务函数结尾返回了一个取消任务的消息,这里真正的价值在于将任务是否结束的决定权交给了任务函数,即可以在任务函数中进行条件判断,当达到一定的业务逻辑条件时,可以返回取消定时任务的消息,这样设置定时任务就更加灵活了

如下,可以在业务中判断是否具备停下来的条件,当条件满足了就停下来不再执行了

import schedule
import time

count=1

def do_func(name,age):
    global count
    count+=1
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))
    if count >= 5:
        print("已经执行5次了,达到预期结果了,不需要再执行了...")
        return schedule.CancelJob


def main():
    schedule.every(2).seconds.do(do_func,"张三丰",100)
    while True:
        schedule.run_pending()


if __name__=="__main__":
    main()

执行结果如下:

2022-05-25 00:19:30 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:19:32 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:19:34 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:19:36 in do func : 姓名:张三丰 年龄:100
2022-05-25 00:19:38 in do func : 姓名:张三丰 年龄:100
已经执行5次了,达到预期结果了,不需要再执行了...

3 获取所有的定时任务

获取所有的定时任务作用就是可以根据一定的条件,对某些满足条件的定时任务进行各种操作如修改等

如下代码为对间隔3的任务从每3秒修改为每3分钟

import schedule
import time


def do_func(name,age):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))

def main():
    schedule.every(2).seconds.do(do_func,"张三丰",100)
    schedule.every(3).seconds.do(do_func, "张三丰", 200)
    all_jobs=schedule.get_jobs()

    print("原始定时任务:")
    for job in all_jobs:
        print(job)
    
    for job in all_jobs:
        if job.interval ==3:
            job.unit="minutes"

    print("修改后的定时任务:")
    for job in all_jobs:
        print(job)


if __name__=="__main__":
    main()

执行结果如下:

原始定时任务:
Job(interval=2, unit=seconds, do=do_func, args=('张三丰', 100), kwargs={})
Job(interval=3, unit=seconds, do=do_func, args=('张三丰', 200), kwargs={})
修改后的定时任务:
Job(interval=2, unit=seconds, do=do_func, args=('张三丰', 100), kwargs={})
Job(interval=3, unit=minutes, do=do_func, args=('张三丰', 200), kwargs={})

4 取消所有任务

如下为取消所有任务的代码,取消之前显示有两个任务,取消后显示有0个定时任务

import schedule
import time


def do_func(name,age):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))

def main():
    schedule.every(2).seconds.do(do_func,"张三丰",100)
    schedule.every(3).seconds.do(do_func, "张三丰", 200)
    print(len(schedule.get_jobs()))
    schedule.clear()
    print(len(schedule.get_jobs()))


if __name__=="__main__":
    main()

执行结果为:

2
0

5 给定时任务打标签,同样通过标签获取或取消定时任务

如下代码演示了给任务打标签,根据标签挑选任务,根据标签清除任务等操作

import schedule
import time


def do_func(name,age):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age))

def main():
    # 定义定时任务时直接打标签
    schedule.every(2).seconds.do(do_func,"张三丰",100).tag("demo1","demo2")
    schedule.every(3).seconds.do(do_func, "张三丰", 200).tag("demo2","demo3")
    schedule.every(4).seconds.do(do_func, "张三丰", 300).tag("demo3", "demo4")

    # 根据demo2标签选择任务
    demo2=schedule.get_jobs("demo2")
    print("根据demo2标签挑选出的任务")
    for job in demo2:
        print(job)

    # 根据标签取消定时任务
    schedule.clear("demo3")
    all_job=schedule.get_jobs()
    print("删除demo3标签的任务后,剩余的任务")
    for job in all_job:
        print(job)


if __name__=="__main__":
    main()

执行结果如下:

根据demo2标签挑选出的任务
Job(interval=2, unit=seconds, do=do_func, args=('张三丰', 100), kwargs={})
Job(interval=3, unit=seconds, do=do_func, args=('张三丰', 200), kwargs={})
删除demo3标签的任务后,剩余的任务
Job(interval=2, unit=seconds, do=do_func, args=('张三丰', 100), kwargs={})
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,需要在项目中安装django-crontab库,在项目的settings.py文件中配置INSTALLED_APPS并添加'django_crontab' 然后,在项目的根目录下新建一个cron.py文件,在文件中编写定时任务代码 接着,在项目根目录下执行python manage.py crontab add 命令,将cron.py文件中的定时任务添加到crontab中 最后,在项目根目录下执行python manage.py crontab show 命令,查看已添加的定时任务 例: 1.在项目的settings.py文件中配置INSTALLED_APPS并添加'django_crontab' INSTALLED_APPS = [ ... 'django_crontab', ] 2.在项目根目录下新建一个cron.py文件,在文件中编写定时任务代码 from django_crontab.app_settings import CRONJOBS @CRONJOBS.register() def my_cron_job(): print('This is a cron job') 3.在项目根目录下执行python manage.py crontab add 命令,将cron.py文件中的定时任务添加到crontab中 4.在项目根目录下执行python manage.py crontab show 命令,查看已添加的定时任务 注意: - 具体的时间表达式可以参考crontab的语法 - django-crontab默认是后台运行的,如果想在前台运行需要手动设置 ### 回答2: 使用django-crontab可以很方便地在Django项目中添加定时任务。下面是一个简单的示例: 首先,在项目的settings.py文件中安装和配置django-crontab。在INSTALLED_APPS列表中添加'django_crontab',然后在文件底部添加以下内容: ``` CRONJOBS = [ ('*/5 * * * *', 'myapp.tasks.my_task') ] ``` 这表示每5分钟执行一次名为my_task的定时任务。myapp是你的应用程序名称。接下来,我们需要创建一个任务函数,例如在myapp/tasks.py文件中: ``` from django_crontab import CronJobBase, Schedule class MyTask(CronJobBase): RUN_EVERY_MINS = 5 schedule = Schedule(run_every_mins=RUN_EVERY_MINS) code = 'myapp.my_task' def do(self): # 这是你的任务逻辑,可以在这里执行任何操作 # 例如,发送邮件或者清理数据库等操作 print("执行定时任务") ``` 在这个例子中,do()方法定义了实际的任务逻辑,我们在这里打印了一条消息。你可以根据实际需求在这里执行任何操作。 最后,在项目的根目录下运行命令`python manage.py crontab add`来启用定时任务。这样,定时任务将在每次运行Django项目时自动执行。 以上就是使用django-crontab编写一个简单的定时任务的步骤。通过配置CRONJOBS列表和定义任务函数,我们可以轻松地添加和管理定时任务。 ### 回答3: 要使用django的django-crontab库编写一个简单的定时任务,首先需要按照以下步骤进行设置: 1.将django-crontab库添加到你的django项目中,可以通过在你的项目的requirements.txt文件中添加"django-crontab"来实现。 2.在你的项目的settings.py文件中,将'django_crontab'添加到INSTALLED_APPS列表中。 3.在settings.py文件的最后,添加以下代码: ``` import os from django_crontab import CronTab CRONJOBS = [ ('*/15 * * * *', 'myapp.cron.my_cron_job', '>> /path/to/log/file.log') ] CRONTAB_COMMAND_SUFFIX = '2>&1' # Optional cron = CronTab() for (schedule, command, output) in CRONJOBS: job = cron.new(command=command, comment=command) job.setall(schedule) job.setall(output) cron.write() ``` 以上代码将创建一个定时任务,任务将每15分钟运行一次。"myapp.cron.my_cron_job"是你自己定义的任务函数,你可以在一个名为cron.py的模块中创建这个函数,并在其中定义具体的任务逻辑。 4.运行`python manage.py crontab add`命令,将任务添加到系统的crontab中。 现在,你的简单定时任务已经设置完成。 注意:为了确保定时任务能够正常运行,你的项目需要在一个支持定时任务的环境中运行,例如使用Celery或者是一个具有定时任务功能的主机。并且,要记得在服务器上启动定时任务服务。 希望这能够帮助你编写一个简单的定时任务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redrose2100

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值