gevg
Фев. 3, 2014 13:04:09
Доброго времени суток, столкнулся с такой странной на мой взгляд проблемой, и не не пойму в чем может собака зарыта быть.
Создаю с помощью модуля threading два потока, в каждом потоке выполняется один и тотже метод класса(метод цепляется телнетом и парсит выхлоп), в определенный момент времени необходимо чтобы выполнение метода было прекращено, я вне потока закрываю соединение. генерируется исключение, пишу обработку исключения вида try/except: sys.exit, из одного потока выходит успешно, а второй почему-то продолжает работу. почему?
gevg
Фев. 3, 2014 18:05:23
Нет предположений не у кого?
Soteric
Фев. 3, 2014 20:47:45
Приложение будет жить до тех пор пока не завершатся все его потоки. Если нужно чтобы поток умирал вместе с приложением, то нужно сделать его демоном.
По-моему так :)
py.user.next
Фев. 3, 2014 21:53:43
gevg
Нет предположений не у кого?
пиши код, не нужно словами
gevg
Фев. 4, 2014 08:32:05
Вообщем вот урезал кусок кода, создается 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()
gevg
Фев. 4, 2014 08:44:59
Разобрался, спасибо) Daemon = True помог
pyuser
Фев. 4, 2014 09:08:51
Мне думается, что правильнее и понятнее будет вот так:
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:15:21
Soteric
Приложение будет жить до тех пор пока не завершатся все его потоки. Если нужно чтобы поток умирал вместе с приложением, то нужно сделать его демоном.
Если поток - демон, то после завершения приложения он демоном и останется :(
Soteric
Фев. 4, 2014 09:27:43
http://docs.python.org/2/library/threading.html#thread-objectsA 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.
Насколько я понял документацию, демон треды должны завершаться автоматически.
gevg
Фев. 4, 2014 10:33:02
pyuser, возможно и правильнее, но лично мне неособо понятнее