2011-07-06 34 views
6

Tôi đang viết một ứng dụng Python đa luồng trên Windows.Ctrl-C không hoạt động khi sử dụng luồng.Timer

Tôi đã sử dụng để chấm dứt ứng dụng bằng cách sử dụng ctrl-c, nhưng khi tôi thêm threading.Timer trường hợp ctrl-c ngừng hoạt động (hoặc đôi khi mất một thời gian rất dài).

Làm cách nào để thực hiện điều này?
Mối quan hệ giữa việc có các chuỗi Hẹn giờ và ctrl-c là gì?

UPDATE:
Tôi tìm thấy sau trong thread documentation Python:

Chủ đề tương tác lạ với ngắt: các KeyboardInterrupt ngoại lệ sẽ được nhận bởi một chủ đề tùy ý . (Khi module tín hiệu có sẵn, luôn luôn ngắt đi đến các chủ đề chính.)

+0

bạn có thể dán mã vào đây không? – Rahul

Trả lời

4

Cách threading.Thread (và do đó threading.Timer) hoạt động là mỗi thread đăng ký chính nó với các mô-đun threading, và khi thoát phiên dịch các thông dịch viên sẽ đợi tất cả các chủ đề đã đăng ký thoát ra trước khi chấm dứt trình thông dịch thích hợp. Điều này được thực hiện để các chủ đề thực sự hoàn thành việc thực thi, thay vì yêu cầu trình thông dịch bị loại bỏ một cách dã man từ bên dưới chúng. Vì vậy, khi bạn nhấn^C, luồng chính sẽ nhận tín hiệu, quyết định chấm dứt và đợi cho đến khi bộ hẹn giờ kết thúc.

Bạn có thể đặt chủ đề ma quỉ (với phương pháp setDaemon) để làm cho các mô-đun threading không chờ đợi cho các chủ đề, nhưng nếu chúng xảy ra để được thực thi mã Python trong khi thoát phiên dịch, bạn sẽ có được các lỗi khó hiểu trong thoát. Ngay cả khi bạn hủy bỏ threading.Timer (và thiết lập nó daemonic) nó vẫn có thể thức dậy trong khi thông dịch viên đang bị phá hủy - bởi vì phương pháp 's cancel chỉ cần nói threading.Timer không thực hiện bất cứ điều gì khi nó thức dậy, nhưng nó phải thực sự thực thi Mã Python để thực hiện quyết định đó.

Không có cách nào duyên dáng để chấm dứt chuỗi (ngoại trừ chuỗi hiện tại) và không có cách đáng tin cậy nào để làm gián đoạn chuỗi bị chặn. Một cách tiếp cận dễ quản lý hơn đối với bộ tính giờ thường là vòng lặp sự kiện, giống như các GUI và các hệ thống hướng sự kiện khác cung cấp cho bạn. Những gì để sử dụng phụ thuộc hoàn toàn vào những gì khác chương trình của bạn sẽ hoạt động.

+0

Cảm ơn bạn đã xem lớn hơn. Trong thời gian này tôi đã đánh dấu các chủ đề daemonic đã giải quyết được vấn đề, nhưng tôi đoán tại một thời điểm nào đó, tôi sẽ phải cấu trúc lại để có một luồng kết thúc thích hợp. – Jonathan

+0

sẽ xử lý tín hiệu được thực hiện, nếu bộ hẹn giờ được đặt trong cùng một luồng? Nếu vậy nếu một timer.Cancel có thể được thiết lập trong bộ xử lý tín hiệu, có thể quá trình thoát bây giờ không? – Vivek

+0

+1. là có một số tài nguyên giải thích tại sao có * "không có cách duyên dáng để chấm dứt chủ đề (khác với hiện tại), và không có cách đáng tin cậy để làm gián đoạn một sợi bị chặn" *? – n611x007

2

Có một bài thuyết trình của David Beazley đã làm sáng tỏ một số chủ đề. PDF có sẵn here. Nhìn xung quanh các trang 22 - 25 ("Interlude: Signals" to "Frozen Signals").

+0

Đó là một PDF sâu sắc thực sự! – Jonathan

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