【发布时间】:2021-07-25 22:59:10
【问题描述】:
在我当前的程序中,我使用 subprocess.Popen() 启动服务器并使用 readline() 继续从标准输出读取。但是,当它卡在 readline 上时,直到出现新行。这很糟糕,因为我需要能够在等待服务器输出时执行其他代码。有没有办法阻止这种情况发生?
import subprocess
server = subprocess.Popen("startup command", stdout= subprocess.PIPE, encoding= "utf-8")
while True:
out = server.stdout.readline()
if out != "":
print(out)
print("checked for line")
我宁愿避免使用多线程,因为我的代码的不同部分将不再是线程安全的。
【问题讨论】:
-
你必须使用线程。由于 GIL,线程安全在 Python 中通常不是大问题。
-
取决于你在做什么。您仍然可以与 GIL 交错。设置
threading.Queue非常简单,可以轻松沟通。 -
绝对没有理由让线程参与进来;此时它们只会使您的程序复杂化。如果简单地轮询不是一个合理的选择,请使用其中一个异步库(有几个,而且在所有这些库中都很容易)。请记住,通过管道传输到子进程的文件描述符实际上与任何其他文件描述符没有什么不同;对其进行特殊处理的唯一原因是您还可以在需要时跟踪退出代码。
标签: python subprocess popen