2011-01-05 45 views
8

Documentation for logging module nói rằngxử lý tín hiệu và khai thác gỗ trong Python

Nếu bạn đang thực hiện xử lý tín hiệu không đồng bộ bằng cách sử dụng mô-đun tín hiệu, bạn có thể không có khả năng sử dụng khai thác gỗ từ bên trong xử lý như vậy. Điều này là do việc triển khai khóa trong mô-đun luồng không phải lúc nào cũng tái nhập, và do đó không thể được gọi từ các trình xử lý tín hiệu như vậy.

Điều này cho thấy người ta không nên thực hiện cuộc gọi đăng nhập từ mã được trình xử lý tín hiệu gọi trực tiếp hoặc gián tiếp. Nếu bạn làm một lần trong một thời gian chương trình sẽ được trái là một nhà nước khi chỉ giết -9 giúp.

Câu hỏi quan trọng đối với tôi hiện giờ là sau. Vấn đề khóa này có thể xảy ra khi các chủ đề khác gọi phương thức ghi nhật ký tại thời điểm khi chủ đề chính đang xử lý tín hiệu?

Trả lời

7

Trình xử lý tín hiệu cần xử lý đặc biệt trong lập trình UNIX. Chỉ một danh sách được xác định của các hàm POSIX C được khai báo là reentrant và có thể được gọi trong bộ xử lý tín hiệu POSIX. IEEE Std 1003.1 liệt kê 118 chức năng UNIX reentrant bạn tìm thấy tại https://www.opengroup.org/ (yêu cầu đăng nhập).

tín hiệu

Nhưng Python là không đồng bộ: Các signal module có một làm rõ:

Mặc dù bộ xử lý tín hiệu Python được gọi không đồng bộ như xa như người dùng Python là có liên quan, họ có thể chỉ xảy ra giữa “nguyên tử” hướng dẫn của trình thông dịch Python . Điều này có nghĩa là các tín hiệu đến trong các phép tính dài được thực hiện hoàn toàn bằng C (chẳng hạn như đối sánh cụm từ thông dụng trên số lớn nội dung văn bản) có thể bị trì hoãn trong một khoảng thời gian tùy ý là .

Trong trường hợp này, tín hiệu trong Python được hoãn cho đến khi GIL là miễn phí.

Quay lại câu hỏi của bạn. Không, miễn là bạn sử dụng chức năng tái nhập trong chức năng xử lý tín hiệu. Nếu việc ghi nhật ký chỉ được sử dụng trong các chủ đề, sẽ không có vấn đề gì.

+0

Tôi đã mở một chuỗi bổ sung liên quan đến các hàm __Which được tái tham gia bằng Python để xử lý thư viện tín hiệu__ (http: // stackoverflow.com/questions/4604634/function-is-re-entrant-in-python-for-signal-library-processing) –

2

GIL (Khóa thông dịch toàn cầu) ngăn không cho bất kỳ mã Python nào chạy cùng một lúc, vì vậy về mặt kỹ thuật, luồng chính không thể xử lý tín hiệu trong khi các luồng khác đang chạy. Nó có thể "xuất hiện" theo cách đó nhưng có một mutex lớn chỉ cho phép một chuỗi python chạy cùng một lúc.

Điều tốt nhất tôi có thể đoán, vấn đề với tín hiệu và luồng là tín hiệu thường được gây ra bởi gián đoạn có thể xảy ra bất kỳ lúc nào. Vì vậy, tôi sẽ tưởng tượng Python dừng những gì nó đang làm và gọi trình xử lý. Tại thời điểm này một khóa có thể đã được mua lại và vì vậy nếu đăng nhập cố gắng khóa lại, bạn sẽ bị bế tắc. Trong một số triển khai, điều này hoạt động OK vì mutex có thể bị khóa nhiều lần (người tham gia lại) nhưng những người khác chỉ có một khóa.

Hy vọng rằng người khác có thể sao lưu điều này.

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