【问题标题】:Python Subprocess efficiently check if child process terminatedPython Subprocess 有效地检查子进程是否终止
【发布时间】:2018-07-10 21:49:59
【问题描述】:

我正在使用子进程运行这个 bash cmd 以在远程系统中启动 jmeter。

['java', '-server', '-XX:+HeapDumpOnOutOfMemoryError', '-Xms512m', '-Xmx512m', '-XX:+UseG1GC', 
'-XX:MaxGCPauseMillis=250', '-XX:G1ReservePercent=20', '-Djava.security.egd=file:/dev/urandom', 
'-Xms1024m', '-Xmx1024m', '-jar', '/jmeter/apache-jmeter-4.0/bin/ApacheJMeter.jar', '-n', 
'-t', '/code/jmx_file.jmx', '-JReplica_ID=1', '-JService_Name=execution-b063818a',
'-l', '/code/logs/logs.log']

现在我正在使用while loop 来检查子进程是否终止,如果终止,则刷新日志文件,如下所示

sub_proc = subprocess.Popen(
                    bash_cmd,
                    stdout=proc_log,
                    stderr=proc_log
                )
# while the process is still running, dump the data to the file.
while sub_proc.poll() is None:
    proc_log.flush()
    os.fsync(proc_log)
sub_proc.wait()  

但是这个while loop 正在将我的进程拍摄到 100% 的 CPU 利用率。

我想知道是否有任何其他方法可以有效地检查子进程是否像上面那样终止以减少 CPU 使用率。

【问题讨论】:

  • 你已经wait 有效地让孩子终止......在while循环之后。那么为什么你会在无限循环中刷新日志文件?子进程正在处理它们的 I/O,而不是你的。
  • 抱歉没有关注你,你的意思是这里不需要while循环来检查孩子是否终止,或者需要while循环但不需要flush。我认为刷新不会在这里造成 CPU 使用率飙升
  • sub_proc.wait() 将已经检查孩子是否已终止。我不明白你为什么首先要flushfsync。所以我不能说你是否可以删除它,因为显然你有理由添加它。

标签: python subprocess


【解决方案1】:

将睡眠添加到您的while loop,否则它必然会使用尽可能多的 CPU:

from time import sleep
sub_proc = subprocess.Popen(
                    bash_cmd,
                    stdout=proc_log,
                    stderr=proc_log
                )
# while the process is still running, dump the data to the file.
while sub_proc.poll() is None:
    proc_log.flush()
    os.fsync(proc_log)
    sleep(0.05) #change to acceptable value
sub_proc.wait()  

您正在检查它是否以正确的方式与sub_proc.poll() is None 一起运行。

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 2015-02-12
    • 2018-03-11
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-04-07
    相关资源
    最近更新 更多