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-сокеты не подключены, поэтому ваше беспокойство по поводу отключения не применимо.

Дело в том, что каждый раз, когда я создаю сокет, я должен располагать / закрывать его после отправки данных?

Да, если вы собираетесь создавать миллионы сокетов, пожалуйста, закройте их, как вы идете. В противном случае у вас закончатся слоты дескриптора файла, ограниченный ресурс в вашем процессе.

Другие вопросы по тегам