我正在尝试在线程中运行一个子进程,该子进程将定期输出数据(但每秒多次(
但是,当尝试读取进程的 stdout 时,communicate(timeout=2)
总是遇到超时错误,即使有效的 stdout 数据应该可用。
该代码在烧瓶应用程序中运行,在用 daemon=True
生成的线程中运行。
我尝试运行的进程是
print("A")
time.sleep(1)
print("B")
time.sleep(5)
print("C")
exit()
这应该给我"A"和"B"而不会超时。
这是应该给我输出的循环:
with Popen(
args=[get_python_path(), path.join(
self.path, "output.py")],
stdout=PIPE, stderr=PIPE, universal_newlines=True) as proc:
self.status = RNNTrainer.STARTED
status = None
while status == None:
try:
stdout, stderr = proc.communicate(timeout=2)
print(stdout)
status = proc.returncode
except TimeoutExpired as err:
print("Timeout Expired")
proc.poll()
status == proc.returncode
except Exception as err:
print("Unhandled Ex")
我希望看到这样的输出:
A
B
Timeout expired <-This after the sleep(5) call
C
但是,相反,我得到了
Timeout expired
Timeout expired
Timeout expired
A
B
C
换句话说。 .communicate
仅在程序终止时有效。否则它就会结束
将flush=True
添加到print()
调用
print("A", flush=True)
time.sleep(1)
print("B", flush=True)
time.sleep(5)
print("C", flush=True)
exit()
此力print()
冲洗流。
交互时,标准输出和标准流是行缓冲的。否则,它们像常规文本文件一样进行块缓冲。可以使用 -u 命令行选项覆盖此值。