2009-03-13 20 views
13

Tôi có một chức năng thỉnh thoảng bị treo. Thông thường tôi sẽ đặt báo thức, nhưng tôi đang ở trong Windows và không có sẵn. Có một cách đơn giản xung quanh này, hay tôi chỉ cần tạo một thread gọi time.sleep()?signal.alarm thay thế trong Windows [Python]


Đã kết thúc bằng một chuỗi. Chỉ lừa được sử dụng os._exit thay vì sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
+2

Ông có thể loại bỏ các câu trả lời từ * Câu hỏi của bạn * và gửi nó như một ... thực tế * câu trả lời *? – ThiefMaster

+1

bạn có thể [sử dụng 'threading.Timer()' thay thế] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ThiefMaster đã hoàn tất! – LondonRob

Trả lời

2

Bạn có thể - như bạn nói - chỉ cần kick off một chủ đề mới mà ngủ cho rằng số giây.

Hoặc bạn có thể sử dụng một trong các bộ hẹn giờ đa phương tiện của Windows (bằng Python, có trong windll.winmm). Tôi tin rằng timeSetEvent là những gì bạn đang tìm kiếm. Ngẫu nhiên, tôi tìm thấy một đoạn mã sử dụng nó here.

3

Giải pháp mạnh mẽ nhất là sử dụng một tiến trình con, sau đó giết tiến trình con đó. Python2.6 thêm .kill() vào subprocess.Popen().

Tôi không nghĩ rằng phương pháp tiếp cận luồng của bạn hoạt động như bạn mong đợi. Việc xóa tham chiếu của bạn đến đối tượng Thread sẽ không giết chết luồng. Thay vào đó, bạn cần đặt thuộc tính mà chuỗi sẽ kiểm tra khi nó đánh thức.

+0

bạn có thể làm rõ cách sử dụng '.kill()' để xử lý một hàm treo sau một khoảng thời gian nhất định không? –

+0

Rhamphoryncus: Tôi nghĩ rằng điểm của bạn về việc xóa các tham chiếu thread làm việc hay không là phần nào tranh luận trong trường hợp này. Điều cuối cùng mà phương thức 'run()' của lớp con 'threading.Thread' thực hiện là gọi' os._exit() ', và thậm chí nếu không, phương thức này sẽ kết thúc và có hiệu quả trở thành" bị giết ". Tệ hơn là 'del alarm' là không cần thiết. – martineau

3

Dưới đây là cách áp phích gốc giải quyết vấn đề của riêng mình:

Đã kết thúc bằng một chuỗi. Chỉ lừa được sử dụng os._exit thay vì sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far