簡體   English   中英

為什么我的python SIGPROF不起作用?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM