我正在寻找一个Python库,它将提供
at
和
cron
类似的功能。
我很想有一个纯Python解决方案,而不是依赖于安装在盒子上的工具;这样我就可以在没有 cron 的机器上运行。
对于那些不熟悉
cron
的人:您可以根据如下表达式来安排任务:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
cron 时间表达式语法不太重要,但我想要一些东西具有这种灵活性。
如果没有什么东西可以为我开箱即用地执行此操作,那么任何有关构建块的建议都将非常感激。
编辑 I我对启动进程不感兴趣,只是也用 Python 编写的“作业” - python 函数。我认为这必然是一个不同的线程,但不是在不同的进程中。
为此,我正在寻找 cron 时间表达式的表达能力,但在 Python 中。
Cron 有 已经存在很多年了,但我正在努力尽可能地便携。我不能依赖它的存在。
Python 中类似 Cron 的调度器
有很多 Python 库可以实现类似 Cron 的调度功能,无需依赖系统安装的 Cron。以下是一些流行的选择:
1. Schedule:
- 纯 Python 实现,易于使用。
- 支持类 Cron 语法的时间表达式。
- 不支持秒级精度。
import schedule
import time
def job():
print("I'm running!")
schedule.every().day.at("10:30").do(job)
while True:
schedule.run_pending()
time.sleep(1)
2. APScheduler:
- 功能强大的调度库,支持多种调度器后端(内存、数据库等)。
- 支持类 Cron 语法以及更复杂的时间表达式。
- 支持秒级精度。
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
def job():
print("I'm running!")
scheduler = BackgroundScheduler()
trigger = CronTrigger(day_of_week='mon-fri', hour='9-17', minute='*/2')
scheduler.add_job(job, trigger=trigger)
scheduler.start()
# 保持主线程运行
try:
while True:
time.sleep(2)
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()
3. Celery:
- 分布式任务队列,可以用于调度和执行异步任务。
- 支持类 Cron 语法的时间表达式。
- 需要额外的配置,例如消息代理(例如 RabbitMQ 或 Redis)。
from celery import Celery
from celery.schedules import crontab
app = Celery('tasks', broker='redis://localhost')
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
crontab(minute='*/1'), # 每分钟执行一次
my_task.s('hello'),
)
@app.task
def my_task(arg):
print(arg)
4. 自定义解决方案:
-
如果你只需要简单的调度功能,可以考虑使用
time
和threading
模块构建自己的解决方案。 -
可以使用正则表达式解析 Cron 表达式,并使用
time.sleep()
控制任务执行时间。
选择建议:
- 对于简单的调度需求, Schedule 是一个不错的选择。
- 对于更复杂的需求, APScheduler 提供了更多的功能和灵活性。
- 如果需要分布式任务调度, Celery 是一个强大的选择。
- 如果你只需要简单的功能并且想要完全控制代码,可以考虑 自定义解决方案 。
希望这些信息能帮到你!
标签:python,cron,scheduled-tasks From: 373335