如果同时读取和追加同一文件会发生什么(Python编程)?
我正在写一个脚本,使用两个线程,一个线程负责读取文件,另一个线程负责向文件添加内容,这两个线程运行得都很频繁。
我的问题是,如果一个线程正在读取文件,而另一个线程正好在往文件中添加字符串,比如“这是一个测试”,会发生什么呢?
我知道,如果你添加的字符串比缓冲区小,不管其他线程多频繁地读取文件,读取到的内容永远不会出现不完整的行,比如“这是一”。我的意思是,操作系统要么先把“这是一个测试”添加到文件中,然后再读取文件的信息;要么先读取文件的信息,然后再把“这是一个测试”添加到文件中;这种情况是不会发生的:先添加“这是一”,再读取文件信息,最后添加“个测试”。
但是,如果“这是一个测试”足够大(假设它是一个比缓冲区大的字符串),那么操作系统就不能一次性完成添加操作,所以这个添加操作会被分成两部分:先添加“这是一”到文件中,然后再添加“个测试”。在这种情况下,如果我恰好在整个添加操作的中间读取文件,我会得到这样的结果:先添加“这是一” -> 读取文件信息 -> 再添加“个测试”,这意味着我可能会读取到一个包含不完整字符串的文件吗?
1 个回答
如果你对此感到担心,可以让你的消费者(读取数据的人)去寻找一个特殊字符,比如换行符,这样它就知道没有写入不完整的数据。也就是说,你的生产者(写数据的人)可以输出部分数据,但消费者会知道它只收到了部分写入的数据。
你有没有考虑过用管道(PIPE)而不是文件?还有,你为什么要使用线程?这样做其实没有太大好处,除了可能让代码更简单,但在我看来,你不如使用独立的进程,这样可以更好地利用这个模型。
补充一下:不幸的是,这些输入输出的事情不仅仅是Python的处理方式,还和操作系统的处理方式有关。你提到的关于缓冲区的担忧都是正确的。
http://docs.python.org/library/functions.html#open
我建议你去了解一下你的缓冲区大小,但我也不知道怎么检查。我现在用的是OSX系统。