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

时间:2011-01-10 11:37:18

标签: python multithreading file-io operating-system

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

我的问题是,如果一个线程正在读取文件,而另一个线程正在将“这是一个测试”等字符串附加到此文件中,会发生什么?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

http://docs.python.org/library/functions.html#open

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