2011-01-05 62 views
5

Thảo luận về Signal handlers and logging in Python câu hỏi có chức năng tái nhập trong Python xuất hiện trong tâm trí của tôi.Các hàm nào được tái tham gia bằng Python để xử lý thư viện tín hiệu

Các signal library đề cập đến:

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 hướng dẫn nguyên tử 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à .

Đó lại lối vào không phải là điển hình được chỉ ra bởi các logging library:

Nếu bạn đang thực hiện không đồng bộ xử lý tín hiệu 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ừ trong các trình 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 là lại, và do đó không thể được gọi từ trình xử lý tín hiệu như vậy.

Tôi hơi bối rối vì thư viện tín hiệu nói về GIL (khóa thông dịch toàn cầu) là ".. giữa hướng dẫn nguyên tử ..". Trong trường hợp này, tín hiệu được hoãn lại và được thực thi ngay sau khi GIL được để lại/mở khóa. Một loại hàng đợi tín hiệu.

Điều đó có ý nghĩa nhưng không quan trọng nếu các chức năng được gọi bởi trình xử lý tín hiệu bị trì hoãn được gọi lại bởi vì chúng không được gọi trong bộ xử lý tín hiệu POS thực POSIX với sự lặp lại "re-entrant":

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

Trả lời

2

Tôi tin rằng những gì làm cho các mô-đun khai thác gỗ không reentrant là nó sử dụng một threading.Lock (thay vì một RLock) để đồng bộ hóa một số đề đăng nhập vào bộ xử lý tương tự (vì vậy các thông điệp không nhận được interweaved). Điều này có nghĩa rằng nếu một cuộc gọi đăng nhập đã bị khóa bị gián đoạn bởi một bộ xử lý tín hiệu và xử lý tín hiệu cố gắng để đăng nhập nó sẽ bế tắc mãi mãi chờ đợi cho acquire trước đó được phát hành.

Các khóa này không liên quan gì đến GIL bằng cách này, chúng là khóa "do người dùng tạo" để đặt nó theo cách nào đó, GIL là khóa được sử dụng bởi trình thông dịch (chi tiết triển khai).

+0

Tôi đã kiểm tra bản phát hành Python 2.7.1 và giả định của bạn là sai.Kiểm tra hàm '_acquireLock()' trong http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup –

+0

Tôi đã sửa chữa, nó thực sự là ' RLock'. Cảm ơn bạn đã đào nó lên. Tuy nhiên, theo các tài liệu, việc triển khai có thể không phải lúc nào cũng là người tham gia lại: "Đ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" (http://docs.python.org/library/logging.html # thread-safety) – albertov

+0

Đây là những gì tôi đã đề cập trong câu hỏi của mình. Chúng ta có thể ước tính rằng mỗi mô-đun sử dụng thư viện luồng không phải là người tham gia lại theo nghĩa được sử dụng trong bộ xử lý tín hiệu * thực * POSIX. Nhưng không Python trì hoãn xử lý tín hiệu? –

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