以下是我用来试验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()
块会更加统一,就像使用类文件对象一样。
答案 0 :(得分:1)
文件对象不知道是否有其他人拥有该文件的打开句柄,因此他们无法区分"空文件与作者"来自"没有作家的空文件&#34 ;;关闭文件的编写器读取它的句柄不可见。
相比之下,管道传达那种信息,它们是由作者明确关闭的流,以便将数据传达给读者。
如果文件的作用类似于管道,由于编写者缺少信息,当你用完线路时,你会无限期地阻塞,等待另一条永不到达的线路。
基本上,它们是出于根本不同的目的,不要指望一个人的行为与另一个完全相同。