1

私はたくさんのことをするスクリプトを持っていて、起こっていることのCPUとメモリ使用量を監視するスレッドを生成したいと思います。

監視部分は次のとおりです。

import psutil
import time
import datetime

def MonitorProcess():
    procname = "firefox"

    while True:
            output_sys = open("/tmp/sysstats_counter.log", 'a')

            for proc in psutil.process_iter():
                    if proc.name == procname:
                            p = proc

            p.cmdline

            proc_rss, proc_vms =  p.get_memory_info()
            proc_cpu =  p.get_cpu_percent(1)

            scol1 = str(proc_rss / 1024)
            scol2 = str(proc_cpu)

            now = str(datetime.datetime.now())

            output_sys.write(scol1)
            output_sys.write(", ")
            output_sys.write(scol2)
            output_sys.write(", ")
            output_sys.write(now)
            output_sys.write("\n")

            output_sys.close( )

            time.sleep(1)

監視を行うためのより良い方法があると確信していますが、現時点では気にしません。

メインスクリプトは次のように呼び出します。

RunTasks() # which runs the forground tasks 
MonitorProcess() # Which is intended to monitor the tasks CPU and Memory Usage over time

両方の機能を同時に実行したい。これを行うには、スレッドライブラリを使用する必要があると想定しています。次に、次のようなことを行うためのアプローチはありますか。

thread = threading.Thread(target=MonitorProcess())
thread.start

それとも私は離れていますか?

また、RunTasks()関数が終了したときに、MonitorProcess()を自動的に停止させるにはどうすればよいですか?プロセスが存在するかどうか、そしてそれが関数を強制終了しないかどうかをテストできると思いますか?

4

1 に答える 1

2

デーモンスレッドが必要なようです。ドキュメントから:

スレッドは「デーモンスレッド」としてフラグを立てることができます。このフラグの重要性は、デーモンスレッドのみが残っているときにPythonプログラム全体が終了することです。初期値は作成スレッドから継承されます。フラグはデーモンプロパティを介して設定できます。

あなたのコードでは:

thread = threading.Thread(target=MonitorProcess)
thread.daemon = True
thread.start()

デーモンスレッドがまだアクティブであっても、メインが終了するとプログラムは終了します。監視スレッドを設定して開始した後、フォアグラウンドタスクを実行する必要があります。

于 2012-11-14T03:24:01.283 に答える