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("job
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用 Celery 实现定时任务的示例: 1. 首先安装 celery: ``` pip install celery ``` 2. 在项目的根目录下新建一个名为 tasks.py 的文件,编写定时任务的代码: ``` from celery import Celery app = Celery('tasks', broker='redis://localhost:6379/0') @app.task def task1(): # 在这里编写 task1 的逻辑 pass @app.task def task2(): # 在这里编写 task2 的逻辑 pass ``` 其中,broker 参数指定 celery 使用 redis 存储任务队列和结果的地址,需要根据实际情况修改。这里演示了两个定时任务,分别是 task1 和 task2。 3. 在项目的根目录下新建一个名为 celery.py 的文件,配置 celery: ``` from celery import Celery from celery.schedules import crontab app = Celery('tasks', broker='redis://localhost:6379/0') app.conf.beat_schedule = { 'task1': { 'task': 'tasks.task1', 'schedule': crontab(minute='*/5'), # 每5分钟执行一次 }, 'task2': { 'task': 'tasks.task2', 'schedule': crontab(hour=1, minute=0), # 每天凌晨1点执行 }, } ``` 其中,beat_schedule 参数是定时任务的配置,具体格式可以参考 Celery 文档。这里演示了两个定时任务,分别是每5分钟执行一次的 task1 和每天凌晨1点执行的 task2。 4. 启动 celery: ``` celery -A celery worker -l info -B ``` 其中,-A 参数指定 celery 的应用名,-l 参数指定日志级别,-B 参数表示启动 celery 定时任务。 至此,就完成了 Celery定时任务配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值