[英]Why my python SIGPROF doesn't work?
我正在安裝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)
這些計時器只在進程執行時才會減少,因為它主要是睡眠,計時器到期需要很長時間,如果你從文檔中刪除睡眠應該可以正常工作:
signal.ITIMER_PROF在進程執行時以及系統代表進程執行時減少間隔計時器。 再加
嘗試:
while True:
for i in xrange(100000):
pass
不,它按預期工作。 如文檔所述 ,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
信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.