Nếu bạn thực sự muốn bắt C-c cụ thể, thì bạn có thể thực hiện điều này theo cách thông thường cho ứng dụng Python - sử dụng signal.signal
để cài đặt trình xử lý SIGINT
làm bất cứ điều gì bạn muốn. Nếu bạn gọi bất kỳ API xoắn nào từ trình xử lý, hãy đảm bảo bạn sử dụng reactor.callFromThread
vì hầu như tất cả các API được xoắn khác không an toàn để gọi từ trình xử lý tín hiệu.
Tuy nhiên, nếu bạn thực sự chỉ quan tâm đến việc chèn một số mã dọn dẹp thời gian ngừng hoạt động, thì có thể bạn muốn sử dụng IService.stopService
(hoặc cơ chế theo đó nó được triển khai, reactor.addSystemEventTrigger
) thay thế.
Nếu bạn đang sử dụng twistd
, sau đó sử dụng IService.stopService
thật dễ dàng. Bạn đã có đối tượng Application
với ít nhất một dịch vụ được đính kèm với nó. Bạn có thể thêm một số khác với phương thức tùy chỉnh stopService
để tắt máy của bạn. Phương thức này được phép trả về một số Deferred
. Nếu có, thì quá trình tắt máy sẽ bị tạm dừng cho đến khi xảy ra vụ nổ Deferred
. Điều này cho phép bạn dọn dẹp các kết nối của mình một cách độc đáo, ngay cả khi có liên quan đến một số hoạt động mạng (hoặc bất kỳ hoạt động không đồng bộ) nào khác.
Nếu bạn không sử dụng twistd
, sau đó sử dụng trực tiếp reactor.addSystemEventTrigger
có lẽ dễ dàng hơn. Bạn có thể cài đặt trước khi tắt máy kích hoạt sẽ được gọi trong cùng một trường hợp IService.stopService
sẽ được gọi. Trình kích hoạt này (chỉ bất kỳ đối tượng có thể gọi) nào cũng có thể trả lại Deferred
để trì hoãn tắt máy. Điều này được thực hiện với một cuộc gọi đến reactor.addSystemEventTrigger('before', 'shutdown', callable)
(đôi khi trước khi tắt máy được khởi động, do đó nó đã được đăng ký bất cứ khi nào tắt máy xảy ra).
service.tac cung cấp ví dụ về cách tạo và sử dụng dịch vụ tùy chỉnh.
wxacceptance.py đưa ra ví dụ về việc sử dụng addSystemEventTrigger
và trì hoãn tắt máy bằng (tùy ý) ba giây.
Cả hai cơ chế này sẽ cung cấp cho bạn thông báo bất cứ khi nào lò phản ứng dừng lại. Điều này có thể là do một phím tắt C-c, hoặc có thể do ai đó sử dụng kill -INT ...
hoặc có thể do một nơi nào đó gọi là reactor.stop()
. Tất cả đều dẫn đến tắt lò phản ứng, và tắt lò phản ứng luôn xử lý các sự cố tắt máy.
Nguồn
2010-08-10 22:29:59
ngọt ngào, lần đầu tiên nhấn vào googling "xoắn trước khi tắt máy"! – Claudiu