首页 > 后端开发 > Python教程 > 如何在Python中实现子进程管道的非阻塞读取?

如何在Python中实现子进程管道的非阻塞读取?

DDD
发布: 2024-12-19 13:55:11
原创
754 人浏览过

How Can I Achieve Non-Blocking Reads from Subprocess Pipes in Python?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板