0

0

如何在 Windows 上安全地让多个 Python 脚本并发写入同一文件

花韻仙語

花韻仙語

发布时间:2026-01-05 14:03:16

|

319人浏览过

|

来源于php中文网

原创

如何在 Windows 上安全地让多个 Python 脚本并发写入同一文件

本文介绍使用 `portalocker` 库实现跨进程文件写入锁,确保多实例 python 脚本在 windows 下安全、有序地向同一文本文件追加内容,避免竞态与覆盖,且支持自动等待而非报错退出。

在 Windows 环境下运行多个 Python 进程(如并行执行相同脚本)时,若它们都尝试写入同一个文本文件(如记录已完成任务的 completed.txt),极易因缺乏同步机制导致数据丢失、内容错乱或 PermissionError/IOError 异常。你当前的逻辑是:每处理完一个任务就将该任务名追加到 completedlist,再一次性写入文件——这种“累积后批量写入”模式虽简洁,但在多实例场景下存在明显风险:两个进程可能同时打开文件、覆盖彼此内容,或因写入顺序混乱导致重复/遗漏。

解决此问题的核心是强制写入操作互斥,即任一进程写入时,其他进程必须等待。Python 标准库中的 threading.Lock 仅作用于线程内,无法跨进程;而 Windows 对文件句柄的独占控制又较严格,简单用 open(..., 'a') 并不能保证原子性。此时,推荐使用轻量、稳定、跨平台的第三方库 portalocker ——它通过调用系统级文件锁(Windows 使用 _winapi.LockFileEx,类 Unix 使用 fcntl.flock)实现真正的进程级排他访问。

✅ 正确做法:带自动等待的排他写入

首先安装依赖:

pip install portalocker

然后重构你的写入逻辑(注意:必须使用 'a' 模式打开文件,并在写入前加锁、写入后解锁):

比话降AI
比话降AI

清除AIGC痕迹,AI率降低至15%

下载

立即学习Python免费学习笔记(深入)”;

import portalocker
import time

FILE_PATH = "completed.txt"

def append_to_file(items):
    """安全地将 items 列表逐行追加到文件,自动等待锁释放"""
    for item in items:
        # 关键:每次写入单行,避免长时持锁影响并发效率
        while True:
            try:
                with open(FILE_PATH, 'a', encoding='utf-8') as f:
                    portalocker.lock(f, portalocker.LOCK_EX | portalocker.LOCK_NB)
                    f.write(f"{item}\n")
                    f.flush()  # 确保立即写入磁盘,避免缓冲区延迟
                    portalocker.unlock(f)
                break  # 写入成功,跳出重试循环
            except portalocker.LockException:
                # 文件被其他进程锁定,等待 0.5 秒后重试
                time.sleep(0.5)
            except OSError as e:
                # 兜底:捕获可能的权限/路径异常(如文件被删除)
                print(f"写入失败: {e}")
                time.sleep(1)

# 在你的主循环中调用(保持原有结构不变)
for i in newlist:
    runFunction()
    completedlist.append(i)
    append_to_file([i])  # 每次只追加当前项,更健壮

⚠️ 注意事项与最佳实践

  • 不要批量写整个 completedlist:原逻辑中“累积后全量写入”会显著延长锁持有时间,降低并发吞吐。改为每完成一项立即追加一行,既保持语义清晰,又最小化锁竞争窗口。
  • 务必使用 'a'(append)模式:确保所有写入都发生在文件末尾,避免因文件指针偏移引发覆盖。
  • 显式调用 f.flush():防止操作系统缓存导致内容未及时落盘,尤其在多进程环境下至关重要。
  • LOCK_NB + time.sleep() 实现非阻塞等待:避免 portalocker.lock(f, portalocker.LOCK_EX) 直接抛出异常终止程序;通过捕获 LockException 并轮询,实现优雅等待。
  • 编码声明不可省略:Windows 默认编码易引发 UnicodeEncodeError,显式指定 encoding='utf-8' 提升鲁棒性。
  • 避免锁文件本身被误删:确保 completed.txt 不被其他程序意外删除或移动,否则锁机制失效。

通过以上改造,你无需更改脚本整体流程,即可安全启动任意数量的实例并行处理 newlist ——每个任务结果都会按实际完成顺序、无冲突地持久化到同一文件中。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

734

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

752

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1258

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

162

2026.01.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号