一个不到 100 行的 Python crontab 实现如何使用?

https://github.com/intohole/pyct

主要是大家可以看看思路,我写这个用了很短时间,如果有什么需求可以提给我


一个不到 100 行的 Python crontab 实现如何使用?
15 回复

不知道。


我来给你一个简单的例子。这个实现通常是通过 schedule 库来完成的,它提供了类似 crontab 的定时任务功能。

首先安装库:

pip install schedule

然后看个完整示例:

import schedule
import time
from datetime import datetime

def job1():
    """每分钟执行的任务"""
    print(f"[{datetime.now()}] 每分钟执行的任务")

def job2():
    """每天10:30执行的任务"""
    print(f"[{datetime.now()}] 每天10:30执行的任务")

def job3():
    """每周一10:30执行的任务"""
    print(f"[{datetime.now()}] 每周一10:30执行的任务")

def job4():
    """每5秒执行的任务"""
    print(f"[{datetime.now()}] 每5秒执行的任务")

# 设置定时任务
schedule.every(1).minutes.do(job1)           # 每分钟
schedule.every().day.at("10:30").do(job2)    # 每天10:30
schedule.every().monday.at("10:30").do(job3) # 每周一10:30
schedule.every(5).seconds.do(job4)           # 每5秒

print("定时任务已启动,按 Ctrl+C 停止")

# 主循环
try:
    while True:
        schedule.run_pending()  # 运行所有到期的任务
        time.sleep(1)           # 每秒检查一次
except KeyboardInterrupt:
    print("\n定时任务已停止")

基本用法:

  1. 定义你的任务函数
  2. schedule.every() 设置执行频率
  3. 在主循环中调用 schedule.run_pending()

常用时间设置:

  • every(10).minutes - 每10分钟
  • every().hour - 每小时
  • every().day.at("14:30") - 每天14:30
  • every().monday.at("09:00") - 每周一9:00
  • every().minute.at(":30") - 每分钟的第30秒

这个库的优点是简单直观,适合小型项目或脚本。对于生产环境的大型应用,建议使用 Celery 或 APScheduler。

一句话总结:用 schedule 库可以快速实现简单的定时任务。

很多地方不太 Pythonic 啊
if is True:
https://github.com/intohole/pyct/blob/master/pyct/pyct.py#L81 这是 typo 吧
各种长段的 elif 可以用 dict 代替
condition_type 和 time_range , 这明明是个 enum ,为什么枚举用字符串做?

你是其他语言转 Python 的吧?不光要学会用 Python 写出能跑的程序,还要学着 Pythonic 起来

仅对楼上, pythonic 是指把 python 语法糖玩的很溜?


1. 至少可以减少低级 typo
2. enum 用字符串和用 dict 是 O(n)和 O(logn)的区别
3. enum 也算语法糖? C 里就有的 enum switch 叫语法糖?你可以找找 Abusing the C switch statement

最后, gmtime 是 UTC , cron 应该是跟随系统时区

Duplicate with /t/352016

CTItem 的 equal 函数实现的有问题啊

建议改用 multiprocessing

嗯 我工作的时候用 java , 也写 js , shell , c , c++ 我觉得抠语言没意思 , 写东西 写的是思想,我们不是文豪 东西写出来 , 有用 , 能让人看懂就好

谢谢你的指点

请指教

啊啊啊,刚刚看见。我说一下我的感觉哈:

<br>def __eq__(self , obj):<br> if isinstance(obj , int):<br> for condition in self.conditions:<br> if condition.judge(obj) is True:<br> return True<br> return False<br>
对应的逻辑是这个意思?:

<br>def __eq__(self , obj):<br> if isinstance(obj , int):<br> for condition in self.conditions:<br> if condition.judge(obj) is False:<br> return False<br> return True<br>

我看下 谢谢

回到顶部