2012-11-09 2 views
3

Я хочу добавить новый метод в подкласс Thread, чтобы я мог сказать, что мой рабочий поток вышел изящно. Как это:Можно ли добавить новый метод в класс Thread Python?

class MyThread(threading.Thread): 
    def __init__(self): 
     ... 
     self.__stop_signal = False 
     self.__signal_lock = threading.Lock() 
     ... 

    def run(self): 
     ... 
     self.__signal_lock.acquire(True) 
     stop_signal = self.__stop_signal 
     self.__signal_lock.release() 
     if stop_signal: 
      return 
     ... 

    def stop_elegantly(self): 
     self.__signal_lock.acquire(True) 
     self.__stop_signal = True 
     self.__signal_lock.release() 

Тогда это безопасно это сделать ?:

thread = MyThread() 
thread.start() 
... 
thread.stop_elegantly() 

Спасибо.

ответ

1

Да, это выглядит хорошо. На самом деле вы могли бы сделать это еще более «элегантно» с:

def stop_elegantly(self): 
    with self.__signal_lock: 
     self.__stop_signal = True 

На самом деле я не думаю, что вам нужно даже замок, чтобы получить доступ к переменной-члена, так как там будет отдельный один выделяется для каждого экземпляра вашего подкласс. См. Это answer, например, который добавляет метод stop() к подклассу threading.Thread.

+0

Спасибо. Что касается блокировки, я думаю, что в некоторых экстремальных условиях блокировка необходима (например, когда значение в памяти отличается от значения в кеше). Из-за этого немного переборщить, чтобы использовать замок здесь. – kkpattern

+0

@ kkpattern: Мне кажется, что аппаратное обеспечение cpu позаботится о любых ошибках памяти и кэшированных несоответствий памяти в пределах одного потока. Во всяком случае, спасибо за выбор моего ответа. Кстати, здесь принято также голосовать за ответ, который вы принимаете, если считаете его достойным. – martineau

0
self.__signal_lock.acquire(True) 
    stop_signal = self.__stop_signal 
    self.__signal_lock.release() 

Вышеуказанный код находится в цикле? Если да, я думаю, что он работает хорошо.

+0

Извините, я имею в виду безопасно вызывать метод 'stop_elegantly()' из другого потока. В документе Python не переопределяются методы, отличные от 'run()' и '__init __()', но он ничего не говорит о добавлении нового метода и вызове его. – kkpattern

+0

hmm. stop_elegantly() вызывается главным образом в вашем коде, не так ли? Я думаю, что основной поток - это еще один поток в вашем комментарии выше. –

+0

Да, вы правы. Безопасно вызывать метод из класса Thread, например 'join()', в основном потоке. Я хочу знать, что также безопасно вызвать метод, добавленный мной в подклассу Thread. – kkpattern

Смежные вопросы