python fifo是否必须使用os.open来读取?
我正在尝试在Python中为IPC例程使用fifos,并且有以下代码来创建fifo,然后启动两个线程在不同的时间写入它,并不断读取它以打印出放在fifo上的任何内容。
它在使用os.open()读取fifo时工作。 然而,我在阅读O'Reilly的“Programming Python 4th Edition”,他们声称fifo可以通过“消费者”过程作为文本文件对象打开。
在这里,将“consumer”线程切换为“consumer2”函数的目标是尝试将fifo作为文本对象读取,而不是使用os.open。 但是,当以这种方式读取时,当调用“readline”方法时程序被阻塞。
有没有办法在文本对象中读取fifo,或者是否必须使用os.open来读取它?
import os, time, threading
fifofile = '/tmp/thefifo'
if not os.path.exists(fifofile):
os.mkfifo(fifofile)
def producer():
num = 0
fifo_out = os.open(fifofile, os.O_WRONLY) #open the fifo for writing
while True:
time.sleep(num)
os.write(fifo_out, "".join(["Message ",str(num)]).encode())
num = (num + 1) % 5
def consumer():
fifo_in = os.open(fifofile, os.O_RDONLY)
while True:
line = os.read(fifo_in, 24)
print("Read: %s" % line.decode())
def consumer2():
fifo_in = open(fifofile, "r") #open for reading as text object...
while True:
line = fifo_in.readline()[:-1] #read an available line on the fifo...
print("Line read: %s" % line)
#Thread the calls...
producerTH = threading.Thread(target=producer)
consumerTH = threading.Thread(target=consumer) #using consumer2 does not work
producerTH.start()
consumerTH.start()
为此,我在OS X 10.10.3中使用Python 3.4.3。
在写入消息之后os.write(fifo_out, "n".encode())
你只需要os.write(fifo_out, "n".encode())
,因为readline
需要“ n”
上一篇: Does a python fifo have to be read with os.open?
下一篇: Look how to fix column calculation in Python readline if use color prompt