Python 中子进程管道的非阻塞读取
子进程管道提供了一种在 Python 中与外部程序进行通信的方法。但是,默认情况下从标准输出读取会阻止该过程,直到数据可用为止。对于需要非阻塞读取的应用程序,可以考虑多种方法。
避免 fcntl、select 和 asyncproc
虽然通常建议使用 fcntl、select 和 asyncproc可能不适合这种场景。 fcntl 和 select 需要特定于平台的代码,而 asyncproc 依赖于多处理,这可能会带来额外的开销,并且与管道的交互效果很差。
基于队列的解决方案
可靠的解决方案便携式解决方案是使用 Queue.get_nowait() 调用。它的工作原理如下:
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
在这种方法中,使用单独的线程将子进程的输出排队到队列中。然后主进程可以尝试从队列中获取数据而不会阻塞。如果队列为空,则返回 Empty 异常。
此解决方案既可移植又高效,并且允许在子进程管道上进行非阻塞读取,而不需要特定于平台的代码或额外的依赖项。
以上是如何在Python中实现子进程管道的非阻塞读取?的详细内容。更多信息请关注PHP中文网其他相关文章!