Python đọc dữ liệu tín hiệu như thế nào?
Các hệ thống UNIX/Linux cung cấp các cơ chế đặc biệt để giao tiếp giữa từng tiến trình riêng lẻ. Một trong những cơ chế này là các tín hiệu, và thuộc về các phương thức giao tiếp khác nhau giữa các tiến trình (Inter Process Communication, viết tắt là IPC) Show Nói tóm lại, tín hiệu là các ngắt phần mềm được gửi đến chương trình (hoặc quy trình) để thông báo cho chương trình về các sự kiện hoặc yêu cầu quan trọng đối với chương trình để chạy một chuỗi mã đặc biệt. Một chương trình nhận được tín hiệu sẽ dừng hoặc tiếp tục thực hiện các lệnh của nó, kết thúc có hoặc không có kết xuất bộ nhớ hoặc thậm chí đơn giản là bỏ qua tín hiệu Mặc dù được định nghĩa trong tiêu chuẩn POSIX, phản ứng thực sự phụ thuộc vào cách nhà phát triển viết tập lệnh và triển khai xử lý tín hiệu Trong bài viết này, chúng tôi giải thích tín hiệu là gì, chỉ cho bạn cách gửi tín hiệu đến một quy trình khác từ dòng lệnh cũng như xử lý tín hiệu nhận được. Trong số các mô-đun khác, mã chương trình chủ yếu dựa trên mô-đun tín hiệu. Mô-đun này kết nối các tiêu đề C tương ứng của hệ điều hành của bạn với thế giới Python Giới thiệu về tín hiệuTrên hệ thống dựa trên UNIX, có ba loại tín hiệu
Mỗi tín hiệu được biểu thị bằng một giá trị số nguyên và danh sách các tín hiệu khả dụng tương đối dài và không nhất quán giữa các biến thể UNIX/Linux khác nhau. Trên hệ thống Debian GNU/Linux, lệnh 2 hiển thị danh sách các tín hiệu như sau
Các tín hiệu từ 1 đến 15 được chuẩn hóa đại khái và có ý nghĩa như sau trên hầu hết các hệ thống Linux
Để gửi tín hiệu đến một quy trình trong thiết bị đầu cuối Linux, bạn gọi lệnh 3 với cả số tín hiệu (hoặc tên tín hiệu) từ danh sách trên và id của quy trình (pid). Lệnh ví dụ sau gửi tín hiệu 15 (SIGTERM) đến quy trình có pid 12345
Một cách tương đương là sử dụng tên tín hiệu thay vì số của nó
Bạn chọn cách nào tùy thuộc vào cách nào thuận tiện hơn cho bạn. Cả hai cách đều có tác dụng như nhau. Kết quả là quá trình nhận được tín hiệu SIGTERM và kết thúc ngay lập tức Sử dụng Thư viện tín hiệu PythonKể từ Python 1. 4, thư viện 4 là thành phần thông thường của mọi bản phát hành Python. Để sử dụng thư viện 4, trước tiên hãy nhập thư viện vào chương trình Python của bạn như sau
Việc nắm bắt và phản ứng đúng trên tín hiệu nhận được được thực hiện bằng chức năng gọi lại - cái gọi là trình xử lý tín hiệu. Một bộ xử lý tín hiệu khá đơn giản tên là 6 có thể được viết như sau
Trình xử lý tín hiệu này không làm gì khác ngoài việc báo cáo số lượng tín hiệu nhận được. Bước tiếp theo là đăng ký các tín hiệu được bộ xử lý tín hiệu bắt. Đối với các chương trình Python, tất cả các tín hiệu (trừ 9, SIGKILL) có thể được bắt trong tập lệnh của bạn Tiếp theo, chúng tôi thêm thông tin quy trình cho quy trình hiện tại và phát hiện id quy trình bằng methode 7 từ mô-đun 8. Trong một vòng lặp 9 vô tận, chúng tôi chờ đợi các tín hiệu đến. Chúng tôi triển khai điều này bằng cách sử dụng thêm hai mô-đun Python - os và time. Chúng tôi cũng nhập chúng vào đầu tập lệnh Python của mình 3Trong vòng lặp 9 của chương trình chính của chúng ta, câu lệnh in xuất ra "Đang chờ. ". Lệnh gọi hàm 1 khiến chương trình đợi trong ba giâyHãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó Cuối cùng, chúng ta phải kiểm tra kịch bản của mình. Đã lưu tập lệnh dưới dạng 2, chúng ta có thể gọi nó trong một thiết bị đầu cuối như sau 7Trong cửa sổ đầu cuối thứ hai, chúng tôi gửi tín hiệu đến quy trình. Chúng tôi xác định quy trình đầu tiên của mình - tập lệnh Python - theo id quy trình như được in trên màn hình, ở trên 8Trình xử lý sự kiện tín hiệu trong chương trình Python của chúng tôi nhận tín hiệu mà chúng tôi đã gửi đến quy trình. Nó phản ứng tương ứng và chỉ cần xác nhận tín hiệu nhận được 9Bỏ qua tín hiệuMô-đun tín hiệu xác định các cách để bỏ qua các tín hiệu nhận được. Để làm được điều đó, tín hiệu phải được kết nối với chức năng được xác định trước 3. Ví dụ dưới đây chứng minh điều đó, và kết quả là chương trình Python không thể bị gián đoạn bởi 4 nữa. Để dừng tập lệnh Python, một cách khác đã được triển khai trong tập lệnh ví dụ - tín hiệu SIGUSR1 chấm dứt tập lệnh Python. Hơn nữa, thay vì một vòng lặp vô tận, chúng tôi sử dụng phương pháp 5. Nó chỉ chờ tín hiệu được nhậnXử lý tín hiệu đúng cáchTrình xử lý tín hiệu mà chúng tôi đã sử dụng cho đến nay khá đơn giản và chỉ báo cáo tín hiệu đã nhận. Điều này cho chúng tôi thấy rằng giao diện của tập lệnh Python của chúng tôi đang hoạt động tốt. Hãy cải thiện nó Bắt tín hiệu đã là một cơ sở tốt nhưng cần một số cải tiến để tuân thủ các quy tắc của tiêu chuẩn POSIX. Để có độ chính xác cao hơn, mỗi tín hiệu cần có phản ứng thích hợp (xem danh sách ở trên). Điều này có nghĩa là trình xử lý tín hiệu trong tập lệnh Python của chúng ta cần được mở rộng theo một quy trình cụ thể cho mỗi tín hiệu. Điều này hoạt động tốt nhất nếu chúng ta hiểu tín hiệu làm gì và phản ứng thông thường là gì. Quá trình nhận tín hiệu 1, 2, 9 hoặc 15 sẽ kết thúc. Trong bất kỳ trường hợp nào khác, dự kiến cũng sẽ viết một kết xuất lõi Cho đến bây giờ, chúng tôi đã triển khai một quy trình duy nhất bao gồm tất cả các tín hiệu và xử lý chúng theo cùng một cách. Bước tiếp theo là thực hiện một quy trình riêng cho mỗi tín hiệu. Mã ví dụ sau minh họa điều này cho các tín hiệu 1 (SIGHUP) và 15 (SIGTERM) 3Hai chức năng trên được kết nối với các tín hiệu như sau 0Chạy tập lệnh Python và gửi tín hiệu 1 (SIGHUP) theo sau là tín hiệu 15 (SIGTERM) bằng lệnh UNIX 6 và 7 dẫn đến đầu ra sau 1Tập lệnh nhận tín hiệu và xử lý chúng đúng cách. Để rõ ràng, đây là toàn bộ kịch bản Đọc thêmSử dụng mô-đun 4 và trình xử lý sự kiện phù hợp, việc bắt tín hiệu tương đối dễ dàng. Biết ý nghĩa của các tín hiệu khác nhau và để phản ứng đúng như được định nghĩa trong tiêu chuẩn POSIX là bước tiếp theo. Nó yêu cầu trình xử lý sự kiện phân biệt giữa các tín hiệu khác nhau và có một thói quen riêng cho tất cả chúng
Tín hiệu hoạt động như thế nào trong Python?Trình xử lý tín hiệu Python luôn được thực thi trong luồng Python chính của trình thông dịch chính, ngay cả khi tín hiệu được nhận trong luồng khác . Đ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. Thay vào đó, bạn có thể sử dụng các nguyên hàm đồng bộ hóa từ mô-đun luồng.
Python có thể được sử dụng để xử lý tín hiệu không?Một trong những ưu điểm chính của Python là các gói có thể được sử dụng để mở rộng ngôn ngữ nhằm cung cấp các khả năng nâng cao như thao tác mảng và ma trận [5], xử lý ảnh [12] . [5], and visualization [7].
Python xử lý Ctrl C như thế nào?Bạn có thể xử lý CTRL + C bằng cách bắt ngoại lệ KeyboardInterrupt. Bạn có thể triển khai bất kỳ mã dọn dẹp nào trong trình xử lý ngoại lệ. . Chú ý khi sử dụng dung dịch này. . điều này sẽ không hoạt động cho strg+d?. Vấn đề với KeyboardInterrupt là, nó sẽ đưa bạn ra khỏi khối thử Trình xử lý tín hiệu Python là gì?Trình xử lý tín hiệu là hàm do người dùng xác định, trong đó các tín hiệu Python có thể được xử lý . Nếu chúng ta lấy tín hiệu SIGINT (Tín hiệu ngắt), hành vi mặc định sẽ là dừng chương trình đang chạy hiện tại. Tuy nhiên, chúng tôi có thể chỉ định một trình xử lý tín hiệu để phát hiện tín hiệu này và thay vào đó thực hiện xử lý tùy chỉnh của chúng tôi. |