Tôi có một trình nền Python bằng ren. Giống như bất kỳ daemon tốt, nó muốn khởi động tất cả các chủ đề công nhân của nó, sau đó chờ đợi cho đến khi nó được yêu cầu chấm dứt. Tín hiệu bình thường cho việc chấm dứt là SIGTERM
và trong hầu hết các ngôn ngữ tôi muốn giữ để chấm dứt bằng cách chờ một sự kiện hoặc mutex, do đó, việc sử dụng threading.Event
có ý nghĩa với tôi. Vấn đề là đối tượng Event
của Python và các tín hiệu Unix dường như không hoạt động tốt với nhau.Tại sao sử dụng kết quả luồng.Event trong SIGTERM không bị bắt?
này làm việc như mong đợi, chấm dứt trên SIGTERM
:
import signal
import time
RUN = True
def handle(a, b):
global RUN
print "handled"
RUN = False
signal.signal(signal.SIGTERM, handle)
while RUN:
time.sleep(0.250)
print "Stopping"
nhưng kết quả này trong không SIGTERM
được giao (ví dụ, hoàn toàn ngoài bỏ, "xử lý" không bao giờ được in):
import signal
import threading
RUN_EVENT = threading.Event()
def handle(a, b):
print "handled"
RUN_EVENT.set()
signal.signal(signal.SIGTERM, handle)
RUN_EVENT.wait()
print "Stopping"
Vì vậy, câu hỏi của tôi là:
- Tôi có lạm dụngkhôngtheo một cách nào đó?
- Nếu không, có một sự thay thế nào khác với cơ chế bình chọn và ngủ trong ví dụ đầu tiên không?
- Ngoài ra nếu tôi không, tại sao sử dụng
threading.Event
hãy hủy trình xử lý tín hiệu?
Tính năng khó chịu của Python, nhưng là giải pháp hoàn hảo. Cảm ơn bạn. Tôi sẽ thú nhận rằng nó đã không xảy ra với tôi để tìm các hạn chế bổ sung về sử dụng 'tín hiệu', vì tôi biết rằng C tương đương sẽ hoạt động tốt. –
Điều này có nghĩa là cách duy nhất để xử lý các tín hiệu là dành chủ đề chính (phụ huynh) cho các tín hiệu bắt (bằng cách chặn trên 'signal.pause()')? Điều đó ngụ ý là chủ đề chính không thể làm bất cứ điều gì hữu ích nữa. Nói cách khác, bạn không thể có mô hình master/worker (trong đó 2 chủ đề nói chuyện với nhau) nhưng bạn cần mô hình master/worker + worker (nơi 2 nhân viên nói chuyện với nhau và master không làm gì cả. –