
需求是使用 subprocess 执行一个耗时命令,对终端的输出进行非阻塞的实时监控,当终端输出 error 信息时,关闭 Popen ,或者执行一段时间后自动关闭 Popen 。因为同时需要实时来监控多个终端输出,需要非阻塞。我依次使用了以下两种方法:
1 、 最初的实现为使用 asyncio 创建一个 loop 并且 run_forever() ,然后将读取 Popen 输出的阻塞方法( While Popen is None )注册到该 loop 上运行,读取 stdout 输出,如果没有检测到 error 信息,就 asyncio.sleep(0.01);后来我发现当存在多个 Popen 的时候,sleep 切换会导致有的终端输出读取丢失,并不能实时读取到,所以我采用第二种方法;
2 、 第二次实现是给每个 Popen 创建一个线程,使用线程的 daemon start 来实时监控,资源消耗会比 1 大但是目前还没有遇到读取实时监控的问题。
然后又有一个需求,如果用户想要中途终止该进行监控的 subprocess 的 Popen ,该如何中途停止该 Popen 呢?
另求:各路大神有没有比上述方案 1 和方案 2 中更适合的实现非阻塞实时读取输出的方案?
1 ysc3839 2022-04-27 10:37:45 +08:00 我不了解 Python 。但是异步框架一般有读 fd 的功能吧?同时读所有管道对应的 fd 就好了。 |
2 julyclyde 2022-04-27 11:01:24 +08:00 不能实时还是不能读到? |