2009-07-27 37 views

Trả lời

9

Trước tiên, khi thiết lập trình xử lý tín hiệu sử dụng mô-đun signal, bạn phải tạo chúng trong chuỗi chính. Bạn sẽ nhận được một ngoại lệ nếu bạn cố tạo chúng trong một chuỗi riêng biệt.

Trình xử lý tín hiệu được đăng ký qua chức năng signal.signal() sẽ luôn được gọi trong chuỗi chính. Trên các kiến ​​trúc hỗ trợ gửi tín hiệu tới luồng, ở mức C, tôi tin rằng thời gian chạy Python bỏ qua tất cả các tín hiệu trên luồng và có trình xử lý tín hiệu trên luồng chính, nó sử dụng để gửi tới trình xử lý tín hiệu mã Python của bạn.

Các tài liệu cho các mô-đun thread nói rằng KeyboardInterrupt ngoại lệ (mà thường được kích hoạt bởi SIGINT) có thể delivered to an arbitrary thread trừ khi bạn có signal mô-đun có sẵn cho bạn, mà tất cả các hệ thống Unix nên có. Trong trường hợp đó, nó được gửi đến chủ đề chính. Nếu bạn đang sử dụng hệ thống không có signal, bạn sẽ phải bắt giữ KeyboardInterrupt trong chuỗi của mình và gọi thread.interrupt_main() để nâng cấp lại nó trong chuỗi chính.

Có thể tìm thêm thông tin trong tài liệu Python cho các mô-đun threadsignal.

+0

Thú vị, tôi nghĩ chỉ có chuỗi chính sẽ nhận 'KeyboardInterrupt'. –

+0

Vâng! Ai biết tại sao nó không phải là. –

+1

Theo kinh nghiệm của tôi, và bằng cách đọc tài liệu của tôi, khi mô-đun 'tín hiệu' có sẵn,' KeyboardInterrupt' chỉ được gửi đến luồng chính. – Miles

4

Từ các tài liệu signal:

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à luồng đồng thời là: luôn thực hiện các thao tác signal() trong luồng chính của việc thực thi. Bất kỳ luồng nào cũng có thể thực hiện một alarm(), getsignal(), pause(), setitimer() hoặc getitimer(); chỉ chủ đề chính mới có thể thiết lập bộ xử lý tín hiệu mới và luồng chính sẽ là tín hiệu duy nhất nhận tín hiệu (điều này được thực thi bởi mô-đun tín hiệu Python, ngay cả khi việc triển khai luồng bên dưới hỗ trợ gửi tín hiệu đến từng luồng). Điều này có nghĩa là tín hiệu không thể được sử dụng 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