Tôi đang viết một chương trình có luồng bằng Python. Chương trình này bị gián đoạn rất thường xuyên, bởi người dùng (CRTL + C) tương tác, và bởi các chương trình khác gửi tín hiệu khác nhau, tất cả đều nên ngừng hoạt động thread theo nhiều cách khác nhau. Chủ đề thực hiện một loạt các đơn vị công việc (tôi gọi chúng là "nguyên tử") theo thứ tự.Cách "chính xác" để tạo một chuỗi có thể khóa được bằng Python, cho các đơn vị nguyên tử giả có thể chặn được là gì?
Mỗi nguyên tử có thể dừng lại một cách nhanh chóng và an toàn, vì vậy làm cho chính bản thân dừng lại là khá nhỏ, nhưng câu hỏi của tôi là: cách "đúng" hoặc kinh điển để thực hiện một chủ đề có thể khóa được mảnh nguyên tử của công việc phải được thực hiện?
Tôi có nên thăm dò cờ stop_at_next_check
trước mỗi nguyên tử (ví dụ bên dưới) không? Tôi có nên trang trí mỗi nguyên tử với một cái gì đó mà không kiểm tra cờ (về cơ bản giống như ví dụ, nhưng ẩn trong một trang trí)? Hoặc tôi nên sử dụng một số kỹ thuật khác mà tôi đã không nghĩ đến?
Ví dụ (đơn giản kiểm tra dừng lại cờ):
class stoppable(Thread):
stop_at_next_check = False
current_atom = None
def __init__(self):
Thread.__init__(self)
def do_atom(self, atom):
if self.stop_at_next_check:
return False
self.current_atom = atom
self.current_atom.do_work()
return True
def run(self):
#get "work to be done" objects atom1, atom2, etc. from somewhere
if not do_atom(atom1):
return
if not do_atom(atom2):
return
#...etc
def die(self):
self.stop_at_next_check = True
self.current_atom.stop()