我正在安装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)
答案 0 :(得分:2)
这些计时器只在进程执行时才会减少,因为它大部分处于休眠状态,计时器到期需要很长时间,如果你从docs删除睡眠应该可以正常工作:
signal.ITIMER_PROF 在进程执行时以及系统代表进程执行时,都会减少间隔计时器。耦合
尝试:
while True:
for i in xrange(100000):
pass
答案 1 :(得分:1)
不,它按预期工作。如the documentation所述,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
信号