摘要:Python 有几种方法可以定时调度一个任务,这就是我们将在本文中学习的内容。

本文分享自华为云社区《Python中使用定时调度任务(Schedule Jobs)的5种方式)》,作者: Regan Yue 。

今天构建的大多数应用程序都需要某种方式的调度机制。轮询 API 或数据库、不断检查系统健康状况、将日志存档等是常见的例子。 Kubernetes和Apache Mesos等使用自动伸缩扩容技术(Auto-scaling)的软件需要检查部署的应用程序的状态,为此它们使用定期运行的存活探针(Liveness Probe)。调度任务需要与业务逻辑解耦,因此我们要使用解耦的执行队列,例如Redis队列。

Python 有几种方法可以定时调度一个任务,这就是我们将在本文中学习的内容。我将使用以下方式讨论调度任务:

  1. 简单循环 (Simple Loops)
  2. 简单循环但是使用了线程 (Simple Loops but Threaded)
  3. 调度库 (Schedule Library)
  4. Python Crontab
  5. RQ 调度器作为解耦队列 (RQ Scheduler as decoupled queues)

简单循环 Simple loops

使用简单循环来实现调度任务这是毫不费力的。使用无限运行的 while 循环定期调用函数可用于调度作业,但这不是最好的方法,不过它是很有效的。可以使用内置time模块的slleep()来延迟执行。不过这并不是大多数作业的调度方式,因为,它看起来很难看,而且与其他方法相比,它的可读性较差。

import time
​
def task():print("Job Completed!")
​while 1:task()time.sleep(10)

当涉及到每天早上 9:00 或每周三晚上 7:45 等这些日程安排时,事情就变得比较棘手了。

import datetime
​
def task():print("Job Completed!")
​while 1:now = datetime.datetime.now()# schedule at every wednesday,7:45 pmif now.weekday == 3 and now.strftime("%H:%m") == "19:45":task()# sleep for 6 daystime.sleep(6 * 24 * 60 * 60)

这是我的第一时间想到的解决办法,不用谢!这种方法的一个问题是这里的逻辑是阻塞的,即一旦在 python 项目中发现这段代码,它就会卡在 while 1 循环中,从而阻塞其他代码的执行。

简单循环但是使用了线程Simple loops but threaded

线程是计算机科学中的一个概念。具有自己指令的小程序由进程执行并独立管理,这就可以解决我们第一种方法的阻塞情况,让我们看看怎么样。

import time
import threading
​
def task():print("Job Completed!")
​
def schedule():while 1:task()time.sleep(10)
​
# makes our logic non blocking
thread = threading.Thread(target=schedule)
thread.start()

线程启动后,其底层逻辑无法被主线程修改,因此我们可能需要添加资源,程序通过这些资源可以检查特定场景并根据它们执行逻辑。

定时调度库 Schedule Library

早些时候,我说使用 while 循环进行调度看起来很丑陋,调度库可以解决这个问题。

import schedule
import time
​
def task():print("Job Executing!")
​
# for every n minutes
schedule.every(10).minutes.do(task)
​
# every hour
schedule.every().hour.do(task)
​
# every daya at specific time
schedule.every().day.at("10:30").do(task)
​
# schedule by name of day
schedule.every().monday.do(task)
​
# name of day with time
schedule.every().wednesday.at("13:15").do(task)
​
while True:schedule.run_pending()time.sleep(1)

正如您所见,通过这样我们可以毫不费力地创建多个调度计划。我特别喜欢创建作业的方式和方法链(Method Chaining),另一方面,这个片段有一个 while 循环,这意味着代码被阻塞,不过我相信你已经知道什么可以帮助我们解决这个问题。

Python Crontab

Liunx 中的 crontab 实用程序是一种易于使用且被广泛接受的调度解决方案。Python 库python-crontab提供了一个 API 来使用 Python 中的 CLI 工具。在crontab中,一个定时调度使用 unix-cron字符串格式(* * * * *)来描述,它是一组五个值的一条线,这表明当作业应该被执行时,python-crontab 将在文件中写入 crontab 的计划转换为写入编程方法。

from crontab import CronTab
​
cron = CronTab(user='root')
​
job = cron.new(command='my_script.sh')
​
job.hour.every(1)
cron.write()

python-crontab 不会自动保存计划,需要执行 write() 方法来保存计划。还有更多功能,我强烈建议您查看他们的文档。

RQ 调度器 RQ Scheduler

有些任务不能立即执行,因此我们需要根据 LIFO 或 FIFO 等队列系统创建任务队列并弹出任务。python-rq允许我们做到这一点,使用 Redis 作为代理来排队作业。新作业的条目存储为带有信息的哈希映射,例如created_at, enqueued_at, origin, data, description.

排队任务由名为 worker 的程序执行。workers 在 Redis 缓存中也有一个条目,负责将任务出列以及更新 Redis 中的任务状态。任务可以在需要时排队,但要安排它们,我们需要rq-scheduler。

from rq_scheduler import Scheduler
​
queue = Queue('circle', connection=Redis())
scheduler = Scheduler(queue=queue)
​
scheduler.schedule(scheduled_time=datetime.utcnow(), # Time for first execution, in UTC timezonefunc=func,                     # Function to be queuedargs=[arg1, arg2],             # Arguments passed into function when executedkwargs={'foo': 'bar'},         # Keyword arguments passed into function when executedinterval=60,                   # Time before the function is called again, in secondsrepeat=None,                     # Repeat this number of times (None means repeat forever)meta={'foo': 'bar'}            # Arbitrary pickleable data on the job itself
)

RQ worker(RQ 工作器)必须在终端中单独启动或通过 python-rq 工作器启动。一旦任务被触发,就可以在工作终端中看到,在成功和失败场景中都可以使用单独的函数回调。

总结 Conclusion

还有一些用于调度的库,但在这里,我已经讨论了最常见的库。值得一提的是Celery,celery 的另一个优点是用户可以在多个代理之间进行选择。我很感激你读到最后。也可以看看我的其他文章。干杯!

翻译来源: https://python.plainenglish.io/5-ways-to-schedule-jobs-in-python-99de8a80f28e

点击关注,第一时间了解华为云新鲜技术~

5种Python使用定时调度任务的方式相关推荐

  1. 4种Python文件或者文本加密的方式

    需要注意的是,编译成pyc或者pyo文件后需要将命名改成与源Python命名一致,将其放在源目录下,虽然其他python文件调用pyd时显示不能检测到该模块,但实际上可以运行. 由于pyc的编译收到p ...

  2. Python实现定时执行脚本(3)

    前言 本文是该专栏的第13篇,后面会持续分享python的各种干货知识,值得关注. 不管是爬虫脚本还是自动化脚本,亦或是其他脚本,有时都避免不了需要你加个定时功能,让你的程序脚本在某个时间段自动执行. ...

  3. java定时调度main方法_java相关:Spring中实现定时调度的几种方法

    java相关:Spring中实现定时调度的几种方法 发布于 2020-11-28| 复制链接 本篇文章主要介绍了Spring中实现定时调度示例,可以在无人值守的时候系统可以在某一时刻执行某些特定的功能 ...

  4. 基于大数据开发套件定时调度带资源文件的MapReduce作业

    原文链接:http://click.aliyun.com/m/13937/ MaxCompute里的MR作业,很少是只要跑一次就好了的.如果需要周期性调度,目前MaxCompute(原名ODPS)只提 ...

  5. 玩转Python? 一文总结30种Python的窍门和技巧!

    Python作为2019年必备语言之一,展现了不可替代作用.对于所有的数据科学工作者,如何提高使用Python的效率,这里,总结了30种Python的最佳实践.技巧和窍门.希望这些可以帮助大家在202 ...

  6. Quartz.Net实现作业定时调度详解

    Quartz.Net实现作业定时调度详解 原文:Quartz.Net实现作业定时调度详解 1.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,你能够用它来为执行一个 ...

  7. 【Java多线程】高级主题:定时调度、quartz、指令重排、volatile、ThreadLocal

    定时调度 1000ms后执行 每隔500ms执行一次 package cn.hanquan.test;import java.util.Timer; import java.util.TimerTas ...

  8. 定时调度系列之Quartz.Net详解

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

  9. 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!

    Python作为2020年必备语言之一,展现了不可替代作用.对于所有的数据科学工作者,如何提高使用Python的效率,这里,总结了30种Python的最佳实践.技巧和窍门.希望这些可以帮助大家在202 ...

最新文章

  1. 给互联网巨头“搬砖”的人
  2. Day03——类、值和对象
  3. DevExpress GridControl 后台设置列
  4. java能看懂代码不会写_为什么很多学习Java的人能看懂代码,但就是不会写!
  5. Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2)
  6. 小男孩与苹果树(翻译)(06年10月)
  7. Java + selenium 元素定位(3)之By TagName
  8. POJ - 3250 Bad Hair Day 单调栈
  9. python笔记(求100偶数的和)
  10. selenium窗口截图操作
  11. 带后台管理的超酷jquery+ajax幻灯相册php源码,js幻灯片轮播代码_js源码_js鼠标滚动翻页...
  12. 双硬盘安装ubuntu18.04踩坑及解决全过程
  13. Python 百度智能云文字识别 实现手写文字识别
  14. 物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联
  15. 一般阈值,Otsu,自适应阈值
  16. vant适配移动端750设计稿
  17. LeetCode 322. 零钱兑换***
  18. 在计算机英语中 update是什么意思,电脑出现windows update是什么意思?
  19. 新玺配资:热点轮动明显 均衡配置策略
  20. 人工智能建立本体库_领域本体构建方法概述

热门文章

  1. 线上排查 | 线上Redis负载暴涨100%,业务中断,这样排查很赞!
  2. 群晖 mysql 自动备份_宝塔定时备份网站及数据库至群晖FTP存储空间
  3. TensorFlow笔记(11) GoolgeNet
  4. c语言用字符串统计一个整数中数字的个数_全国计算机等级考试二级C语言
  5. linux race window,java开发环境(QTrace)
  6. HDC2020开发者大会鸿蒙,华为开发者大会HDC 2020将于9月10日开启 鸿蒙OS 2.0亮相
  7. 按需要生成你的网站导航栏
  8. 02 前端篇(选择器和属性)
  9. 安卓 dex 通用脱壳技术研究(四)
  10. Redis基础2(Centos7 下 安装redis)