1

SIGPROFシグナルをインストールし、2秒ごとにハンドラーを実行しています。何か問題ある?

  1 #!/usr/bin/env python
  2 #-*-coding: utf-8 -*-
  3 #pylint: disable=W0141,W0613,W0603
  4 
  5 import os
  6 import sys
  7 import signal
  8 import time
  9 
 10 def myhandler(signum, frame):
 11     print "myhandler"
 12     sys.stdout.flush()
 13 
 14 signal.signal(signal.SIGPROF, myhandler)
 15 signal.setitimer(signal.ITIMER_PROF, 2, 2)
 16 print signal.getitimer(signal.ITIMER_PROF)
 17 
 18 while True:
 19     print "sleeping 1..."
 20     sys.stdout.flush()
 21     time.sleep(1)
4

2 に答える 2

2

これらのタイマーは、プロセスが実行されているときにのみデクリメントします。ほとんどの場合、タイマーが期限切れになるまでに非常に長い時間がかかるため、スリープを解除すると、ドキュメントから正常に機能するはずです。

signal.ITIMER_PROFプロセスが実行されるときと、システムがプロセスに代わって実行されているときの両方で、インターバルタイマーをデクリメントします。結合

試す:

while True:
    for i in xrange(100000):
        pass
于 2012-12-30T19:24:51.957 に答える
1

いいえ、期待どおりに機能します。ドキュメントに記載されているように、ITIMER_PROF

プロセスの実行時とシステムがプロセスに代わって実行しているときの両方で、インターバルタイマーをデクリメントします。ITIMER_VIRTUALと組み合わせて、このタイマーは通常、ユーザーおよびカーネル空間でアプリケーションが費やした時間をプロファイリングするために使用されます。SIGPROFは有効期限が切れると配信されます。

sleep呼び出しによってプロセスは何もしないため、タイマーは非常にゆっくりとデクリメントされます。睡眠を取り除く:

#!/usr/bin/env python
#-*-coding: utf-8 -*-
#pylint: disable=W0141,W0613,W0603

import os
import sys
import signal
import time

def myhandler(signum, frame):
    print "myhandler"
    sys.stdout.flush()

signal.signal(signal.SIGPROF, myhandler)
signal.setitimer(signal.ITIMER_PROF, 2, 2)
print signal.getitimer(signal.ITIMER_PROF)

while True:
    continue

そして、それが実行されると、信号が機能していることがわかります。

$ python prof.py 
(2.004125, 2.000125)
myhandler
myhandler

プロセッサ時間ではなく「リアルタイム」(何をしようとしているのかという質問からは明確ではありません)で時間を計りたい場合は、代わりにITIMER_REALを使用して信号をキャッチしSIGALRMます。

于 2012-12-30T19:29:16.890 に答える