Форум сайта python.su
Здравствуйте! Столкнулся с проблемой.
def connect(self):
self.disconnect()
self.link = socket.socket(type = socket.SOCK_DGRAM)
self.link.settimeout(self.timeout)
def disconnect(self):
if self.link:
self.link.close()
self.link = None
Офлайн
Это фича. Сокет висит открытым некоторое время после close(). Ручки подкрутить это время — нет. Придется с этим жить.
Офлайн
Андрей Светлов
А как же быть, если у меня это реализовано в виде сервера и запросы идут постоянно? Количество соединений вырастает до тысячи очень быстро, что недопустимо для моего приложения.
Сборщик мусора ведь сбрасывает все соединения при завершении программы, или же это ОС закрывает все соединения после завершения скрипта? Есть какой-нибудь выход из этой ситуации?
Офлайн
Андрей Светлов
а разве REUSEADDR не для этого? Или он только для TCP?
haize
Попробуйте сделать через какой-нибудь pycurl. Возможно, что даже многопоточно получится. И да, еще есть вариант - использовать gevent, там своя обертка на сокет и легкие юзерспейс-треды.
Отредактировано (Авг. 3, 2011 23:25:22)
Офлайн
Извините, просмотрел. У вас же UDP сокеты. Так зачем вы их каждый раз заново создаете?
Офлайн
Enchantner, REUSEADDR именно для TCP, причем серверного. Т.е. при .connect он не поможет.
Офлайн
Андрей Светлов
Каждый раз я подключаюсь к серверам с разными IP адресами и портами. Можно как-то переподключиться к другому серверу не вызывая создавая нового экземпляра сокета и не вызывая функцию socket.socket().connect()?
Подскажите, пожалуйста, как будет правильно поступить в этом случае?
Офлайн
У вас UDP? Так используйте sendto/recvfrom.
Офлайн
Андрей СветловДа. Пробовал сегодня вместо socket.connect((self.host, self.port)) сразу отправлять данные с помощью socket.sendto.
У вас UDP? Так используйте sendto/recvfrom.
for ip, port in server_list:
soc.sendto(data, (ip, port))
res = soc.recv(packet_size)
# -- код выполняющий обработку ответа --
Отредактировано (Авг. 4, 2011 23:14:21)
Офлайн
Без полного работающего кода гадаю по пятнам света от проезжающих мимо окна машин.
Зачем вам soc.recv — нужно делать soc.recvfrom.
И вы всё ещё создаёте сокет на каждый запрос?
Офлайн