2010-02-18 7 views
8

Vâng, ít nhất là một bí ẩn đối với tôi. Hãy xem xét những điều sau:hẹn giờ python bí ẩn

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) 

Làm việc như mong đợi, nghĩa là "đánh bại!" tin nhắn sau mỗi 2 giây. Tiếp theo, không có đầu ra nào được sản xuất:

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) 

Sự cố xảy ra ở đâu?

+0

Bạn đã thử thay đổi 'time.sleep (5)' trong chương trình thứ hai thành 'pass'? – Gabe

Trả lời

14

Từ người đàn ông setitimer hệ thống của tôi (tôi nhấn mạnh):

Hệ thống này cung cấp cho mỗi quá trình với ba giờ khoảng thời gian, mỗi decrementing trong một miền thời gian riêng biệt. Khi bất kỳ bộ đếm thời gian hết hạn, một tín hiệu được gửi đến quá trình này và bộ hẹn giờ (có khả năng) khởi động lại.

ITIMER_REAL lần giảm trong thời gian thực và phân phối SIGALRM khi hết hạn.

ITIMER_VIRTUAL chỉ giảm khi quá trình đang thực hiện và phân phối SIGVTALRM khi hết hạn.

Bạn vừa bỏ lỡ quá trình của bạn không thực hiện trong khi ngủ? Sẽ mất rất nhiều thời gian để bạn tích lũy thời gian thực sự sử dụng với vòng lặp đó.

+0

Dường như là một lời giải thích tốt cho tôi. Khi bạn làm 'time.sleep()', quá trình của bạn bị tạm ngưng (tức là không thực hiện). Nếu bạn thay đổi nó thành 'pass', quá trình của bạn sẽ thực thi và tiêu tốn thời gian. – Gabe

+0

Làm thế nào ngớ ngẩn của tôi !!! Ở trên chỉ là một thử nghiệm nhanh chóng để xem các tín hiệu hẹn giờ hoạt động như thế nào ... lỗi newbie (trên tín hiệu). Cảm ơn!! – jldupont

3

Chỉ signal.ITIMER_VIRTUAL chỉ đếm ngược với quy trình đang chạy. time.sleep(5) tạm dừng quá trình sao cho bộ đếm thời gian không giảm.

+0

+1: cảm ơn .......... – jldupont