2011-12-08 34 views
6

Trong tín hiệu python * nix cho phép tôi ngừng ngủ trước khi nó sẵn sàng. Có bất kỳ cơ chế tương tự nào có sẵn trong các cửa sổ - có vẻ như tất cả các phương thức kết thúc chỉ chặn mã sau khi ngủ?Có cách nào để dừng time.sleep trong cửa sổ không?

Mã dụ:

from time import sleep 
.. do something that will intercept the sleep 
try: 
    sleep(60) 
finally: 
    print 'how to get here under 60 seconds in windows?' 

câu hỏi tương tự mà không có một câu trả lời cho các cửa sổ: break/interrupt a time.sleep() in python

tài liệu
+5

Bạn có thể viết mã của mình để mã đang chờ trên 'luồng .Event', với thời gian chờ là 60 và nhấn sự kiện đó từ chuỗi khác nếu bạn muốn hủy chờ? –

+1

đầu tiên đọc câu phân tích dấu chấm câu cổ điển. Muốn có một cách để dừng thời gian bằng cách ngủ ở đâu đó. – Simon

+0

Nó không phải là mã của tôi. Đó là mã khách hàng không rõ ràng mà tôi đang cố gắng dừng lại sau khi hết thời gian chờ. Có vẻ như trong cpython không có cơ chế thực sự tốt tồn tại .. và vâng chúng tôi cũng đã cố gắng đề và subprocess là một không đi. – mkorpela

Trả lời

4

Các Python cho signal nói:

• Mặc dù bộ xử lý tín hiệu Python được gọi là không đồng bộ theo như người dùng Python có liên quan, họ chỉ có thể xảy ra giữa e "nguyên tử" hướng dẫn của trình thông dịch Python. Điều này có nghĩa là các tín hiệu đến trong các tính toán dài được thực hiện hoàn toàn trong C (chẳng hạn như đối sánh cụm từ thông dụng trên các phần lớn văn bản) có thể bị trì hoãn trong một lượng thời gian tùy ý.

trong khi time nói:

Thời gian đình chỉ thực tế có thể ít hơn so với yêu cầu bởi vì bất kỳ tín hiệu bắt sẽ chấm dứt giấc ngủ() sau đây thực hiện các thói quen đánh bắt mà tín hiệu của.

Trên Windows, rõ ràng time.sleep() không được triển khai theo tài liệu, vì trình xử lý tín hiệu nhận được trong khi ngủ không được thực hiện cho đến khi hết thời gian của giấc ngủ. Ví dụ sau đây:

import signal, time 

def handler(signum, frame): 
    print('Signal handler called with signal', signum) 

signal.signal(signal.SIGINT, handler) 

print("signal set, sleeping") 
time.sleep(10) 
print("sleep done") 

in:

signal set, sleeping 
Signal handler called with signal 2 
sleep done 

với dòng đầu tiên xảy ra ngay lập tức và hai sau 10 giây giây, bất kể khi ngắt xảy ra.

Như Thomas K đề xuất, một chiến lược tốt hơn là sử dụng đề tài và đồng bộ hóa.

1

Tôi không chắc chắn nếu điều này sẽ làm điều đó cho bạn, nhưng đây là một chút workaround bạn có thể làm:

for i in range(60): 
    if checkIfIShouldInterruptSleep(): 
     break 
    time.sleep(1) 
print "Finished Sleeping!" 

Đó là chỉ chính xác đến từng giây, nhưng nó có thể phục vụ mục đích của bạn. Chúc mừng mã hóa!

Các vấn đề liên quan