2011-01-06 15 views
8

Tôi có một ứng dụng ren được viết bằng Python, và bất cứ khi nào một ngắt được nhận qua Ctrl +C hoặc đôi khi với kill, ứng dụng sẽ treo. Một dấu vết ngăn xếp được trình bày từ một chủ đề, nhưng ứng dụng vẫn còn ở phía trước, và tôi thường phải nền nó với Ctrl + Z sau đó tìm cách tiêu diệt nó.Tín hiệu Xử lý bằng Python Chủ đề

Cách thích hợp để xử lý tín hiệu và ngắt bàn phím bên trong ứng dụng luồng là gì?

Trả lời

13

Nếu bạn đặt newthread.daemon = True trước khi bắt đầu từng chuỗi, chuỗi sẽ tự động bị xóa khi thoát khỏi chuỗi chính. Đó không phải chính xác những gì bạn đang hỏi, nhưng từ những gì bạn đã mô tả, có vẻ như nó đáng để biết.

+0

Sau đó, tôi cho rằng, câu hỏi sẽ trở thành hiện chủ đề chính nhận được Ctrl + C và các tín hiệu khác theo mặc định? ** EDIT: ** Câu hỏi này được trả lời bởi bài viết của @shanked. –

+0

chỉ cần nhớ: "Chủ đề Daemon đột ngột dừng lại khi tắt máy. Tài nguyên của chúng (chẳng hạn như mở tệp, giao dịch cơ sở dữ liệu, v.v.) có thể không được phát hành đúng cách." https://docs.python.org/2/library/threading.html và https://docs.python.org/3.4/library/threading.html – kkurian

5

Cách tôi làm việc xung quanh vấn đề này là tạo một mô-đun có thể lưu giữ một danh sách các chủ đề. Các mô-đun cũng có một phương pháp đã giết chết tất cả các chủ đề trong danh sách đó. Tôi đã đăng ký phương thức này để được gọi khi nhận được tín hiệu SIGINT. Cuối cùng, tôi đã tạo một lớp bao bọc cho Thread sẽ tự động thêm cá thể đã tạo vào danh sách các luồng.

+1

Tại sao không sử dụng luồng.enumerate? –

+0

1) Không biết nó tồn tại. 2) Trình bao bọc 'Thread' đã tồn tại để thực hiện một số thứ khác không liên quan đến câu hỏi này. Điều đó đang được nói, quá trình này vẫn như cũ. – unholysampler

1

Sử dụng signal module và tiếp tục đọc tại đây Signal handlers and logging in Python về các cạm bẫy có thể xảy ra.

Để nắm bắt các hoạt động Ctrl+C từ người dùng, bạn phải khai báo trình xử lý signal cho SIGINT.

Trong bộ xử lý tín hiệu thông báo (hàng đợi tin nhắn hoặc quyền truy cập thuộc tính đồng bộ RLock) chủ đề của bạn để tắt máy hoặc bạn định làm gì.

+0

Tôi không biết về tương tác GIL (hoặc không tương tác) Với tín hiệu. Điều đó giải thích một số hành vi mà tôi đã gặp phải. –

5

CPython Threading: Interrupting bao gồm những gì xảy ra với các tín hiệu trong chuỗi Python và các giải pháp khác nhau cho vấn đề của bạn. Đó là một đọc tốt.