[英]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.