Форум сайта python.su
Доброго времени суток, столкнулся с такой странной на мой взгляд проблемой, и не не пойму в чем может собака зарыта быть.
Создаю с помощью модуля threading два потока, в каждом потоке выполняется один и тотже метод класса(метод цепляется телнетом и парсит выхлоп), в определенный момент времени необходимо чтобы выполнение метода было прекращено, я вне потока закрываю соединение. генерируется исключение, пишу обработку исключения вида try/except: sys.exit, из одного потока выходит успешно, а второй почему-то продолжает работу. почему?
Офлайн
Нет предположений не у кого?
Офлайн
Приложение будет жить до тех пор пока не завершатся все его потоки. Если нужно чтобы поток умирал вместе с приложением, то нужно сделать его демоном.
thread.daemon = True
Офлайн
gevgпиши код, не нужно словами
Нет предположений не у кого?
Офлайн
Вообщем вот урезал кусок кода, создается 2 потока, и не получается завершить один из них, считывание данных происходит без остановки.
class Client: def __init__(self, host, port, Numb): self.tdmNumb = tdmNumb self.telnetHost = host self.telnetPort = port def getByTelnet(self): try: self.telnetConnection = telnetlib.Telnet(self.telnetHost, self.telnetPort) #телнет соединение except socket.error as msg: main_logger.error(u'Ошибка при соединение по телнет с сервером: ' + self.telnetHost) print u'Анализ полученных данных' while 1: try: returnString = self.telnetConnection.read_until("\n") #возвращает строку print returnString except AttributeError: pass except EOFError: pass def cancelTelnetConnection(self): sys.exit() def __del__(self): self.telnetConnection.close() monitor1 = Client("host.example", "6666", "1") monitor2 = Client("host2.example", "7777", "2") thread1 = threading.Thread(target=monitor1.getByTelnet) thread2 = threading.Thread(target=monitor2.getByTelnet) thread1.start() thread2.start() monitor1.cancelTelnetConnection()
Офлайн
Разобрался, спасибо) Daemon = True помог
Офлайн
Мне думается, что правильнее и понятнее будет вот так:
import telnetlib import threading import time class Client(threading.Thread): def __init__(self, host, port, numb, finished): super().__init__() self.numb = numb self.host = host self.port = port self.finished = finished self.start() def run(self): try: self.connection = telnetlib.Telnet(self.host, self.port) #телнет соединение except socket.error as msg: main_logger.error(u'Ошибка при соединение по телнет с сервером: ' + self.host) print u'Анализ полученных данных' while not finished.is_set(): try: result = self.connection.read_until("\n") #возвращает строку print result except AttributeError: pass except EOFError: pass self.connection.close() clients = (("host.example", "6666", "1"), ("host2.example", "7777", "2")) finished = threading.Event() threads = [Client(*(x + (finished,))) for x in clients] time.sleep(30) finished.set() for thread in threads: thread.join()
Отредактировано pyuser (Фев. 4, 2014 09:11:21)
Офлайн
SotericЕсли поток - демон, то после завершения приложения он демоном и останется :(
Приложение будет жить до тех пор пока не завершатся все его потоки. Если нужно чтобы поток умирал вместе с приложением, то нужно сделать его демоном.
Офлайн
http://docs.python.org/2/library/threading.html#thread-objects
A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread. The flag can be set through the daemon property.Насколько я понял документацию, демон треды должны завершаться автоматически.
Note: Daemon threads are abruptly stopped at shutdown. Their resources (such as open files, database transactions, etc.) may not be released properly. If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event.
Офлайн
pyuser, возможно и правильнее, но лично мне неособо понятнее
Офлайн