Python 定时任务(schedule, Apscheduler, celery, python-crontab)

背景

最近有个需求,需要实现一个定时或定期任务的功能,需要实现每月、每日、每时、一次性等需求,必须是轻量级不依赖其它额外组件,并能支持动态添加任务。

定时任务库对比

根据上面需求,从社区中找到了几个 Python 好用的任务调度库。有以下几个库:

  • schedule:Python job scheduling for humans. 轻量级,无需配置的作业调度库

  • python-crontab: 针对系统 Cron 操作 crontab 文件的作业调度库

  • Apscheduler:一个高级的 Python 任务调度库

  • Celery: 是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具, 也可用于任务调度

优缺点对比:

  • schedule 优点是简单、轻量级、无需配置、语法简单,缺点是阻塞式调用、无法动态添加或删除任务

  • Python-crontab 优点是针对于系统 crontab 操作,支持定时、定期任务,能够动态添加任务,不能实现一次性任务需求

  • Apscheduler 优点支持定时、定期、一次性任务,支持任务持久化及动态添加、支持配置各种持久化存储源(如 redis、MongoDB),支持接入到各种异步框架(如 gevent、asyncio、tornado)

  • Celery 支持配置定期任务、支持 crontab 模式配置,不支持一次性定时任务

schedule

Python 任务调度库,和 requests 库一样 for humans. 这个库也是最轻量级的一个任务调度库,schedule 允许用户使用简单、人性化的语法以预定的时间间隔定期运行Python函数(或其它可调用函数)。

直接使用 pip install schedule 进行安装使用,下面来看看官网给的示例:

	import schedule
	import time

	# 定义你要周期运行的函数
	def job():
		print("I'm working...")
	
	schedule.every(10).minutes.do(job) 				# 每隔 10 分钟运行一次 job 函数
	schedule.every().hour.do(job) 					# 每隔 1 小时运行一次 job 函数
	schedule.every().day.at("10:30").do(job) 		# 每天在 10:30 时间点运行 job 函数
	schedule.every().monday.do(job) 				# 每周一 运行一次 job 函数
	schedule.every().wednesday.at("13:15").do(job) 	# 每周三 13:15 时间点运行 job 函数
	schedule.every().minute.at(":17").do(job) 		# 每分钟的 17 秒时间点运行 job 函数
	
	while True:
		schedule.run_pending() 						# 运行所有可以运行的任务
		time.sleep(1)
schedule 常见问题
  1. 如何并行执行任务
    schedule 是阻塞式的,默认情况下, schedule 按顺序执行所有的作业,不能达到并行执行任务。如下所示:

    	import arrow
    	import schedule
    	
    	def job1():
    		print("job1 start time: %s" % arrow.get().format())
    		time.sleep(2)
    		print("job1 end time: %s" % arrow.get().format())
    	
    	def job2():
    		print("job2 start time: %s" % arrow.get().format())
    		time.sleep(5)
    		print("job2 end time: %s" % arrow.get().format())
    	
    	def job3():
    		print("job3 start time: %s"
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值