python的读取和追加,如果同时读取和追加相同的文件(python编程)会发生什么?

这篇博客讨论了在多线程环境中,一个线程读取文件而另一个线程同时追加数据时可能出现的问题。当追加的数据大于缓冲区大小时,可能会导致读取到不完整的字符串。解决方案是使用特殊字符作为数据完整性的标志,确保消费者能识别出是否发生了部分写入。文章还提到,这是由操作系统级别的I/O处理方式决定的,而非Python特定的。
摘要由CSDN通过智能技术生成

我正在编写一个脚本,使用两个单独的线程1执行文件读取操作,另一个执行追加,两个线程运行相当频繁.

我的问题是,如果一个线程正在读取文件,而另一个线程正好在这个文件中追加诸如“这是一个测试”之类的字符串,那么会发生什么?

我知道如果你附加一个小于缓冲区的字符串,无论你在其他线程中读取文件的频率如何,都不会有不完整的行,例如“This i”出现在你的读取文件中,我的意思是os要么do:追加“这是一个测试” – >从文件中读取信息;或:从文件中读取信息 – >在文件中追加“这是一个测试”;并且这种情况永远不会发生:附加“This i” – >从文件中读取信息 – >附加“测试”.

但是如果“这是一个测试”足够大(假设它是一个比缓冲区更大的字符串),那么os不能在一个操作中附加作业,所以附加的作业将分为两个:首先附加“This i “到文件,然后附加”sa test“,所以在这种情况下如果我碰巧在整个追加操作的中间读取文件,我会得到这样的结果:追加”This i“ – >从文件中读取信息 – >附加“s a test”,这意味着我可能会读取包含不完整字符串的文件?

解决方法:

如果您对此感到担心,请让您的消费者寻找一个特殊字符(终结符可行),以便它知道没有不完整的写入.因此,您的生产者(向文件写入数据的人)可以输出部分数据,但消费者(从文件中读取一个)将知道它只有部分写入.

你有没有使用PIPE而不是文件的原因?你有使用线程的原因吗?你可能没有真正获得任何东西,除了编码的简单性,但IMO你可能也有不同的过程,然后你可以从这个模型中获得收益.

补充:不幸的是,这个I / O的东西不仅仅是Python如何处理事物,而是操作系统如何处理事情.你所说的关于缓冲区的一切都是正确的.

我会试着找出你的缓冲区大小是什么,为此我甚至不知道如何检查.我还是在使用OSX.

标签:python,file-io,multithreading,operating-system

来源: https://codeday.me/bug/20190710/1420893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值