тайна питона тайна - PullRequest
       15

тайна питона тайна

8 голосов
/ 18 февраля 2010

Ну, по крайней мере, для меня загадка. Учтите следующее:

import time
import signal

def catcher(signum, _):
    print "beat!"

signal.signal(signal.SIGALRM, catcher)
signal.setitimer(signal.ITIMER_REAL, 2, 2)

while True:
    time.sleep(5)

Работает, как и ожидалось, т.е. дает "удар!" сообщение каждые 2 секунды. Далее вывод не производится:

import time
import signal

def catcher(signum, _):
    print "beat!"

signal.signal(signal.SIGVTALRM, catcher)
signal.setitimer(signal.ITIMER_VIRTUAL, 2, 2)

while True:
    time.sleep(5)

Где проблема?

Ответы [ 2 ]

15 голосов
/ 18 февраля 2010

От человека моей системы setitimer (выделение мое):

Система предоставляет каждому процессу три интервальных таймера, каждый из которых уменьшается в отдельной временной области . Когда истекает время любого таймера, сигнал отправляется процессу, и таймер (потенциально) перезапускается.

ITIMER_REAL уменьшается в реальном времени и доставляет SIGALRM по истечении срока действия.

ITIMER_VIRTUAL уменьшается только тогда, когда процесс выполняет , и выдает SIGVTALRM по истечении срока.

Вы только что пропустили, что ваш процесс не выполняется во время сна? Вам понадобится очень много времени, чтобы накопить фактически использованное время с этим циклом.

4 голосов
/ 18 февраля 2010

signal.ITIMER_VIRTUAL ведет обратный отсчет только при запущенном процессе. time.sleep(5) приостанавливает процесс, поэтому таймер не уменьшается.

...