Cách đơn giản nhất là để bắt đầu tất cả các chủ đề công nhân như đề daemon, sau đó chỉ cần có vòng lặp chính của bạn được
while True:
sleep(1)
nhấn Ctrl + C sẽ ném một ngoại lệ trong chủ đề chính của bạn, và tất cả các chuỗi daemon sẽ thoát khi trình thông dịch thoát. Điều này giả định bạn không muốn thực hiện dọn dẹp trong tất cả các luồng đó trước khi chúng thoát ra.
Một cách phức tạp hơn là phải có một toàn cầu stopped
Event:
stopped = Event()
def worker():
while not stopped.is_set():
try:
item = q.get_nowait()
do_work(item)
except Empty: # import the Empty exception from the Queue module
stopped.wait(1)
Sau đó, vòng lặp chính của bạn có thể thiết lập stopped
tổ chức sự kiện để False
khi nó được một KeyboardInterrupt
try:
while not stopped.is_set():
stopped.wait(1)
except KeyboardInterrupt:
stopped.set()
này cho phép nhân viên của bạn chủ đề hoàn thành những gì họ đang làm bạn muốn thay vì chỉ có mỗi thread công nhân là một daemon và thoát ra ở giữa thực hiện. Bạn cũng có thể làm bất cứ điều gì bạn muốn.
Lưu ý rằng ví dụ này không sử dụng q.join()
- điều này làm cho mọi thứ phức tạp hơn, mặc dù bạn vẫn có thể sử dụng nó. Nếu bạn làm vậy thì tốt nhất bạn nên sử dụng bộ xử lý tín hiệu thay vì ngoại lệ để phát hiện KeyboardInterrupt
s. Ví dụ:
from signal import signal, SIGINT
def stop(signum, frame):
stopped.set()
signal(SIGINT, stop)
Điều này cho phép bạn xác định điều gì xảy ra khi bạn nhấn Ctrl + C mà không ảnh hưởng đến bất kỳ vòng lặp chính nào của bạn ở giữa. Vì vậy, bạn có thể tiếp tục thực hiện q.join()
mà không phải lo lắng về việc bị gián đoạn bởi Ctrl + C. Tất nhiên, với các ví dụ trên của tôi, bạn không cần phải tham gia, nhưng bạn có thể có một số lý do khác để làm như vậy.
Nguồn
2009-05-04 13:34:45
Vì vậy, về cơ bản, việc sử dụng q.join() khiến việc xử lý các ngoại lệ trong chuỗi có khó khăn không? –
Không nên đọc "tín hiệu (SIGINT, dừng)"? – Ber
Nó làm cho mọi thứ phức tạp hơn, nhưng tôi đã thêm một ví dụ với các tín hiệu để chỉ cho bạn cách bạn sử dụng q.join() nếu bạn có lý do chính đáng để sử dụng điều đó. –