Python - я должен располагать сокетом после отправки данных udp?
У меня есть метод, который прослушивает события, и каждый раз, когда происходит событие, он должен отправлять данные в сокет (его UDP, поэтому я не проверяю, были ли получены данные).
что у меня в event_handler это:
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.sendto(data, (IP, PORT))
Мне кажется, что мне нужно создавать новый сокет каждый раз, когда вызывается событие, потому что я не знаю, сколько времени пройдет между двумя событиями, поэтому наличие глобальной переменной сокета и отправка данных о событии не гарантирует розетка все еще работает.
Дело в том, что каждый раз, когда я создаю сокет, я должен располагать / закрывать его после отправки данных? Каков наилучший способ утилизировать или закрыть розетку после использования?
2 ответа
Как уже объяснял Роб, вам не обязательно каждый раз создавать новый сокет.
Согласно документации ( https://docs.python.org/3/library/socket.html):
Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно () закрывать их или использовать оператор with вокруг них.
Следовательно, если вы решите создать / закрыть каждый раз, вы можете сделать что-то вроде этого:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as socket:
socket.sendto(data, (IP, PORT))
Мне кажется, что мне нужно создавать новый сокет каждый раз, когда вызывается событие,
Нет, можно повторно использовать предыдущий сокет. Помните, что UDP-сокеты не подключены, поэтому ваше беспокойство по поводу отключения не применимо.
Дело в том, что каждый раз, когда я создаю сокет, я должен располагать / закрывать его после отправки данных?
Да, если вы собираетесь создавать миллионы сокетов, пожалуйста, закройте их, как вы идете. В противном случае у вас закончатся слоты дескриптора файла, ограниченный ресурс в вашем процессе.