它真的是readline不会像空文件一样阻塞空文件吗?

时间:2017-02-25 06:09:09

标签: python readline eof

以下是我用来试验Python readline()的代码。

import threading, os, time

def worker():
    file.seek(0) 
    print ("First  attempt on file: " +  file.readline().strip())
    print ("First  attempt on pipe: " +  Iget.readline().strip())
    print ("Second attempt on pipe: " +  Iget.readline().strip())
    file.seek(0) 
    print ("Second attempt on file: " +  file.readline().strip())
    print ("Third  attempt on file: " +  file.readline().strip())

fdIget, fdIset = os.pipe()
Iget = os.fdopen(fdIget)
Iset = os.fdopen(fdIset, 'w')

file = open("Test.txt", "w+")

t = threading.Thread(target=worker)
t.start()

time.sleep(2)
Iset.write("Parent pipe\n")
Iset.flush()
file.write("Parent file.\n")
file.flush()

time.sleep(2)
Iset.write("Again Parent pipe\n")
Iset.flush()
file.write("Again Parent file.\n")
file.flush()

t.join() 

输出

First  attempt on file: 
First  attempt on pipe: Parent pipe
Second attempt on pipe: Again Parent pipe
Second attempt on file: Parent file.
Third  attempt on file: Again Parent file.

readline()似乎没有阻止空文件 - 也许它看到了EOF,因为文件是空的。另一方面,readline()阻塞空文件类对象 - 直到我们关闭类文件对象之后才能看到EOF。我期待我弄错了 - 我遗漏了一些基本的东西。在句柄关闭之前,在空文件上使用readline()块会更加统一,就像使用类文件对象一样。

1 个答案:

答案 0 :(得分:1)

文件对象不知道是否有其他人拥有该文件的打开句柄,因此他们无法区分"空文件与作者"来自"没有作家的空文件&#34 ;;关闭文件的编写器读取它的句柄不可见。

相比之下,管道传达那种信息,它们是由作者明确关闭的流,以便将数据传达给读者。

如果文件的作用类似于管道,由于编写者缺少信息,当你用完线路时,你会无限期地阻塞,等待另一条永不到达的线路。

基本上,它们是出于根本不同的目的,不要指望一个人的行为与另一个完全相同。