2012-10-29 11 views
11

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() 

Trả lời

4

Kiểm tra cờ có vẻ đúng, nhưng bạn đã bỏ lỡ một dịp để đơn giản hóa việc này bằng cách sử dụng danh sách cho các nguyên tử. Nếu bạn đặt các nguyên tử vào một danh sách, bạn có thể sử dụng một vòng lặp đơn mà không cần phương thức do_atom() và vấn đề về nơi thực hiện việc kiểm tra sẽ tự giải quyết.

def run(self): 
    atoms = # get atoms 
    for atom in atoms: 
     if self.stop_at_next_check: 
      break 
     self.current_atom = atom 
     atom.do_work() 
0

Tạo một "chủ đề x nên tiếp tục xử lý" lá cờ, và khi bạn đang thực hiện với các chủ đề, đặt cờ false.

Giết chủ đề trực tiếp được coi là biểu mẫu không hợp lệ, vì bạn có thể hoàn thành một đoạn phân đoạn công việc.

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