2016-06-14 20 views
1

プロセスの経過時間(ゲーム内の追跡時間)をカウントしようとしています。次のコードは動作しますが、CPUは常にビジー状態です。 私はそれがプロセスがまだ実行されているかどうかをチェックするために絶えずポーリングするwhileループと関係があると思います。これを実装するより効率的な方法がありますか?プロセスの実行時間を効率的に測定する

def is_running(process_name): 
    try: 
     subprocess.check_output(['pidof', process_name]) 
     return True 
    except subprocess.CalledProcessError: 
     return False 


def monitor_process(process_name): 
    while True: 
     if is_running(process_name): 
      start_time = time.time() 
      while is_running(process_name): 
       pass 

      return round(time.time() - start_time, 3) 

     else: 
      pass 
+0

最初にプロセスが開始されましたか?コードがそれを開始した場合、プロセスが終了してポーリングを完全にスキップするのを待っているスレッドを残すことができます。 – tdelaney

+0

related:[/ usr/bin/timeを使用したPythonのサブプロセス:タイミング情報を取得する方法は他のすべての出力を無視する方法](http://stackoverflow.com/q/28520489/4279) – jfs

答えて

1

あなたは、実行中のプロセスを検索するためにpsutil(Pythonのシステムとプロセスのユーティリティ) を使用するべきです。

pidofコマンドは、Linuxベースのシステム上で動作することに注意してください Unixユーザのいずれかの実行中のプログラムのPIDを見つけるためにpsコマンドまたはpgrepコマンドを試してみてください。 このコマンドはWindowsでは存在しません。

import psutil 


def filter_by_name(process_name): 
    for process in psutil.process_iter(): 
     try: 
      if process.name() == process_name: 
       yield process 
     except psutil.NoSuchProcess: 
      pass 


def is_running(process_name): 
    return any(p for p in filter_by_name(process_name)) 


process_name = "Mail" 
if is_running(u"{0}".format(process_name)): 
    print(u"{0} is running.".format(process_name)) 
else: 
    print(u"Bad new, {0}'s dead!".format(process_name)) 

これは、与えられたプロセスが実行されている場合、無限ループ を使用してチェックするために消費するリソースがあります。本当に非効率的です! 少なくとも、各繰り返しの間に少し休止するにはtime.sleep(sec)を使用してください。

再度、psutilがお手伝いします。

psutil.process_iter()または filter_by_name()の機能を使用すると、プロセスの終了を待つことができます。 wait()メソッドをtimeout(秒単位)で単に使用してください。 プロセスが終了すると、 は現在の時間を引くことができ、create_time()は処理時間(秒単位)を得ることができます。

import time 

for p in filter_by_name(process_name): 
    p.wait(timeout=10) 
    print(time.time() - p.create_time()) 

注:プロセスを名前で検索すると、重複する可能性があります。

関連する問題