返回输出之前,Python子进程在后台运行

返回输出之前,Python子进程在后台运行,第1张

返回输出之前,Python子进程在后台运行

首先:我建议不要

perf
在您的python进程中进行调用(如您在下面的任务的复杂性中所看到的),而是使用从命令行进行:

sudo perf stat -- python test.py

如果您 真的 想从python中调用perf,那么您将面临一些棘手的问题:

  1. 终止
    perf
    并使其输出收集的性能统计信息,您需要向其发送
    SIGINT
    信号(尝试使用
    sudo perf stat -p mypid
    ctrl-
    将不打印任何内容,而
    ctrl-c
    将打印)
  2. 您需要捕获,
    stderr
    因为perf将其输出发送到
    stderr
    (至少在我的版本中)
  3. 您需要使用
    fork()
    一个进程发送
    SIGINT
    ,而另一进程在进程终止时读取它的输出。如果没有fork,它将无法正常工作,因为在您执行
    SIGINT
    了该
    perf
    过程之后,您将无法再从stdin中读取该过程,因为该进程已经消失了,而当您从头
    stdin
    开始读取该文件时,直到perf被正确终止,您将无法获得任何输出。

这意味着您将最终获得此python程序:

import subprocessimport osimport signalimport timeperf = subprocess.Popen(['perf', 'stat',  '-p', str(os.getpid())], stderr=subprocess.PIPE)# <-- your pre goes hereif os.fork() == 0:    # child    time.sleep(1)  # wait until parent runs `stderr.read()`    perf.send_signal(signal.SIGINT)    exit(0)# parentprint("got perf stats>>{}<<".format(perf.stderr.read().depre("utf-8")))

time.sleep(1)
位是丑陋的,它做什么它,它会,但我想它会做的伎俩为99%的情况。它几乎对perf数据没有影响,唯一的影响是对“总运行时间”(
*xxseconds time elapsed



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存