2015-06-18 13 views
5

Tôi có một mã python rất đơn giản:Tại sao giám sát một ngắt bàn phím trong chủ đề trăn không hoạt động

def monitor_keyboard_interrupt(): 

    is_done = False 

    while True: 
    if is_done 
     break 
    try: 
     print(sys._getframe().f_code.co_name) 
    except KeyboardInterrupt: 
     is_done = True 

def test(): 
    monitor_keyboard_thread = threading.Thread(target = monitor_keyboard_interrupt) 
    monitor_keyboard_thread.start() 
    monitor_keyboard_thread.join() 

def main(): 
    test() 

if '__main__' == __name__: 
    main() 

Tuy nhiên khi tôi bấm 'Ctrl-C' thread không dừng lại. Ai đó có thể giải thích những gì tôi đang làm sai. Bất kỳ trợ giúp được đánh giá cao.

+0

Thử di chuyển vòng lặp while trong khối thử. – piedar

+0

@piedar Nó không hoạt động. – flashburn

+2

Vì luồng không thể nghe tín hiệu; chỉ có chủ đề chính mới có thể. –

Trả lời

3

lý do đơn giản:

Bởi vì chỉ có <_MainThread(MainThread, started 139712048375552)> có thể tạo ra bộ xử lý tín hiệu và lắng nghe các tín hiệu.

Điều này bao gồm KeyboardInterrupt là SIGINT.

này được lấy trực tiếp từ signal tài liệu:

Một số dịch vụ chăm sóc phải được thực hiện nếu cả hai tín hiệu và chủ đề được sử dụng trong cùng một chương trình . Điều cơ bản cần nhớ khi sử dụng tín hiệu và các chủ đề đồng thời là: luôn thực hiện các thao tác tín hiệu() trong luồng thực thi chính . Bất kỳ luồng nào cũng có thể thực hiện báo thức(), getignal(), pause(), setitimer() hoặc getitimer(); chỉ có chủ đề chính mới có thể thiết lập bộ xử lý tín hiệu mới và chủ đề chính là để nhận tín hiệu (điều này được thực thi bởi mô-đun tín hiệu Python, thậm chí nếu triển khai chủ đề cơ bản hỗ trợ gửi tín hiệu đến chủ đề riêng lẻ) . Điều này có nghĩa là không thể sử dụng tín hiệu làm phương tiện liên lạc giữa các luồng. Sử dụng khóa thay thế.

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