简易员工考勤系统需确保并发安全写入和时间序列追加:文件以append模式打开,每条记录含时间戳、工号等字段并采用jsonl格式,写入时用轻量锁保护write+flush操作,三者协同保障数据完整与可维护性。

用并发追加流实现简易员工考勤系统,核心不是造轮子,而是理解“并发安全写入”和“时间序列追加”这两个关键点。初学者不必做 Web 界面或数据库,用文件 + 多线程/协程 + 简单结构就能跑通逻辑。
用追加模式打开日志文件,避免覆盖
考勤本质是不断新增记录(谁、何时、打卡类型),不是更新历史。所以文件必须以 append 模式(如 Python 的 "a"、Go 的 os.O_APPEND)打开。每次写入都自动落到文件末尾,天然适合追加场景。
- 别用
"w"或反复"r+",会清空或覆盖旧数据 - 每条记录建议带时间戳、工号、姓名、类型(如 IN/OUT)、设备标识(可选),用逗号或制表符分隔,方便后续解析
- 示例一行:
2024-06-15T08:32:17,EMP001,张三,IN,desk01
并发写入时加轻量级锁,不阻塞主线程
多个线程/协程同时打卡,直接写文件会乱序甚至损坏(尤其在小文件缓冲区未 flush 时)。不需要全局大锁,只需对 写操作本身加锁:
- Python 可用
threading.Lock()包裹f.write() + f.flush() - Go 可用
sync.Mutex锁住file.Write()调用 - 注意:锁的粒度只到“写一行+刷盘”,不是整个打卡流程(比如查员工是否存在、生成时间戳这些可以并行)
用结构化格式降低解析难度
别存纯文本段落,用固定分隔符或 JSON 行(JSONL)。后者更健壮,尤其姓名含逗号时:
- 推荐每行一个 JSON 对象:
{"ts":"2024-06-15T08:32:17","id":"EMP001","name":"张三","type":"IN"} - 读取时逐行解码,不依赖整文件加载,内存友好
- 后期加统计(如某人当天打卡次数)时,用
grep或 Pythonjson.loads(line)就能快速过滤
模拟并发打卡,验证可靠性
写个简单测试:启动 10 个线程,每个线程随机延迟后调用一次打卡函数,运行 1 分钟。结束后检查:
- 文件行数是否等于总调用次数(无丢失)
- 每行是否合法 JSON / 是否有非法字符(无错写)
- 用
sort -k2,2按工号排序,看同人工号是否连续出现(说明没混行)











