美文网首页
subprogress 监控子进程的输出

subprogress 监控子进程的输出

作者: i_1312 | 来源:发表于2023-11-28 00:01 被阅读0次

    
import subprocess
import psutil
import time
import select
from concurrent.futures import ThreadPoolExecutor



def main():
    p = subprocess.Popen(["python", "test2.py"], stdout=subprocess.PIPE,text=True, stderr=subprocess.PIPE)
    # stdout, stderror = p.communicate()  #会阻塞,但不用担心管道被阻塞
    stdout = ""
    stderr = ""
    memory_usage = 0
    p1 = psutil.Process(p.pid)
    while p.poll() is None:
        memory_usage = max(p1.memory_info().rss /1024 / 1024,memory_usage)
        stdout = stdout + p.stdout.read()
        
        # Wait for up to 20ms for output
        reads = select.select([p.stderr.fileno()], [], [], 0.02)[0]
         # If there is output
        if reads:
            # Read a line from stderr
            stderr = stderr + p.stderr.readline()
        else:
        # If there was no output after 20ms, do something else (like sleeping for a bit)
            time.sleep(0.02)
            
    
    print(stderr)
    print(memory_usage)
    print(stdout[:30])

if __name__ == "__main__":
    main()
    

import time
import logging

for i in range(1,10):
    print(i)
    for i in range(3000):
        print("2222222222222222222222")
    time.sleep(1)

select.select() 是一个Python中的函数,它允许程序监视多个文件描述符,等待它们变得可读、可写或者有错误发生。这个函数通常用于实现多路复用I/O,即同时处理多个连接或者文件。

select.select() 函数有四个参数:

第一个参数是一个列表,包含了你想要监视的文件描述符,等待它们变得可读。
第二个参数也是一个列表,包含了你想要监视的文件描述符,等待它们变得可写。
第三个参数也是一个列表,包含了你想要监视的文件描述符,等待它们有错误发生。
第四个参数是一个超时时间,单位是秒。如果在这个时间内没有任何文件描述符变得可读、可写或者有错误发生,函数就会返回。
在你的代码中,select.select([p.stderr.fileno()], [], [], 0.02)[0] 这行代码的意思是:

[p.stderr.fileno()] 是你想要监视的文件描述符列表,你只关心 p.stderr 是否有数据可以读。fileno() 方法返回的是文件描述符的整数值。
第二个和第三个参数都是空列表,表示你不关心任何文件描述符是否变得可写或者有错误发生。
0.02 是超时时间,单位是秒。如果在20毫秒内 p.stderr 没有数据可以读,select.select() 就会返回。
select.select() 返回的是三个列表,分别对应于输入的三个列表。每个列表中的元素都是在超时时间内变得可读、可写或者有错误发生的文件描述符。在你的代码中,你只关心第一个列表,所以用 [0] 取出了这个列表。
所以,reads = select.select([p.stderr.fileno()], [], [], 0.02)[0] 这行代码的意思是:等待最多20毫秒,看 p.stderr 是否有数据可以读,如果有,就把 p.stderr 的文件描述符放入 reads 列表中。

相关文章

  • python3 subprogress 模块的使用 代替shel

    subprogress允许我们创建新进程,进程之间通过stdin,stdout,stderr管道进行通信,该模块自...

  • golang子进程的的标准输出和标准错误

    golang子进程的的标准输出和标准错误 使用exec.Run()运行子进程的时候,子进程的标准输入输出在哪里呢。...

  • cm007-execsnoop使用(todo))

    execsnoop 就是一个专为短时进程设计的工具。它通过ftrace 实时监控进程的 exec() 行为,并输出...

  • 20笔记---进程1

    今日内容 1.进程是什么 2.程序和进程的区别 ps:每个进程都有父进程,是PPID,子进程则叫PID 2.监控进...

  • golang如何获取子进程的实时输出

    调用子进程,例子调用脚本script.sh并实时的得到子进程的输出。确实情况下父进程要等到子进程完成之后,一次性得...

  • shell输出的传递

    输出的传递 输出的传递 1 管道1.1 命令的组合 2 子shell2.1 利用子shell生成独立的进程2.2 ...

  • 获取SpringBoot工程运行时的操作系统进程ID方法

    Spring Boot为我们提供了操作系统进程PID以及Web服务器端口号输出到文件的能力,这对于我们做进程监控,...

  • JDK自带监控命令的一些用法

    JPS:虚拟机进程监控工具,用户查看当前JVM的实例; 参数: -q 输出VMID -m查看JVM运行的main函...

  • io缓冲

    此段代码会输出8个“*”,因为printf标准输出默认是行缓存,fork子进程会把父进程缓存区同样copy一份。缓...

  • Java子进程 —(一)

    子进程的输入\输出缓冲区大小有限制,要及时取走子进程的输出信息和错误信息。否则很可能因为信息太多导致被填满,最终导...

网友评论

      本文标题:subprogress 监控子进程的输出

      本文链接:https://www.haomeiwen.com/subject/otptgdtx.html