Форум сайта python.su
0
Здравствуйте.
При запуски нескольких скриптов (от 7 и больше) - через какое-то время работы выскакивает вот такая ошибка:
Traceback (most recent call last):Вроде везде все возможные проблемные места запихнул в TRY.
File “C:\Python33\lib\urllib\request.py”, line 1248, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File “C:\Python33\lib\http\client.py”, line 1061, in request
self._send_request(method, url, body, headers)
File “C:\Python33\lib\http\client.py”, line 1099, in _send_request
self.endheaders(body)
File “C:\Python33\lib\http\client.py”, line 1057, in endheaders
self._send_output(message_body)
File “C:\Python33\lib\http\client.py”, line 902, in _send_output
self.send(msg)
File “C:\Python33\lib\http\client.py”, line 840, in send
self.connect()
File “C:\Python33\lib\http\client.py”, line 818, in connect
self.timeout, self.source_address)
File “C:\Python33\lib\socket.py”, line 435, in create_connection
raise err
File “C:\Python33\lib\socket.py”, line 426, in create_connection
sock.connect(sa)
OSError: (WinError 10048) Обычно разрешается одно использование адреса сокета (п
ротокол/сетевой адрес/порт)
Отредактировано admiral (Дек. 23, 2013 12:33:14)
Офлайн
221
admiral
как вы думаете, что произойдет когда 7 веб серверов захотят использовать localhost:80 ? это тонкий намек на вероятную проблему
Офлайн
0
Это не 7 веб-серверов, а 7 веб-клиентов скорее.
Привожу пример:
... ... try: res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id}) rs = urllib.request.urlopen(res_url) res = rs.read() res = res.decode() except: return(False,"SITE_NOT_WORK") rs.close() #закрываем соединение ...
Отредактировано admiral (Дек. 24, 2013 08:25:42)
Офлайн
221
admiral
rs.close() не будет срабатывать когда сработает return, вам вероятнее всего в этом случае нужна конструкция try except finally - прочтите доки что бы уточнить
Офлайн
0
Переделал на такой вариант.
try: res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id}) rs = urllib.request.urlopen(res_url) res = rs.read() res = res.decode() except: print ("Ошибка.") try: rs.close() #закрываем соединение except: print ("Ошибка. Не могу закрыть соединение rs") return(False,"SITE_NOT_WORK") try: rs.close() #закрываем соединение except: print ("Ошибка. Не могу закрыть соединение rs")
Появится сообщение об ошибке элемента управления Winsock, после вызова метода Connect, если один и тот же локальный порт использовался в течение последних четырех минут.Примерно как раз через минуты 4 все и начинается.
Офлайн
221
начал внимательнее смотреть на код и обнаружил что urllib.request - вы наверное ошиблись или используете другую библиотеку urlib?
я использовал urllib.urlopen(url).read() сделал 2000 асинхронных запросов, но повторить ошибку не получилось - диапазон портов для исходящих сообщений большой, перекрыть его это надо целенаправленно стараться..а 7 в вашем случае - пустяк для ОС. Попробуйте либо мой вариант, либо запустить ваш же код на другой ОС Виндовс - может ваша настроена кем то по особому
Офлайн
31
Я такую ошибку у себя гашу закрытием в процессах нескольких pythonw.exe потому как в процессе экспериментов , и многократных запусках скрипта, в процессах висят незакрытые pythonw.exe, даже если программа уже завершена
вот они то и не дают пользовать “разрешается одно использование адреса сокета”
но это с одним и тем же скриптом, а у вас 7 сразу
просто батничком убиваю, TASKKILL /F /IM pythonw.exe
…а если не закрывать соединения?
Отредактировано sanodin (Дек. 25, 2013 09:32:11)
Офлайн
0
JOHN_16Не работает вот так:
начал внимательнее смотреть на код и обнаружил что urllib.request - вы наверное ошиблись или используете другую библиотеку urlib?я использовал urllib.urlopen(url).read() сделал 2000 асинхронных запросов, но повторить ошибку не получилось - диапазон портов для исходящих сообщений большой, перекрыть его это надо целенаправленно стараться..а 7 в вашем случае - пустяк для ОС. Попробуйте либо мой вариант, либо запустить ваш же код на другой ОС Виндовс - может ваша настроена кем то по особому
rs = urllib.urlopen(res_url)
sanodinУ меня только py.exe и python.exe и все. Мне не нужно их убивать, мне нужно добиться, что бы они работали как можно дольше без вылетов.
Я такую ошибку у себя гашу закрытием в процессах нескольких pythonw.exe потому как в процессе экспериментов , и многократных запусках скрипта, в процессах висят незакрытые pythonw.exe, даже если программа уже завершенавот они то и не дают пользовать “разрешается одно использование адреса сокета”но это с одним и тем же скриптом, а у вас 7 сразупросто батничком убиваю, TASKKILL /F /IM pythonw.exe…а если не закрывать соединения?
Отредактировано admiral (Дек. 25, 2013 14:27:51)
Офлайн
31
try , ставьте pass, тогда будет продолжать пока не будет удачного соединения, и уже если соединение удачное и отработало тогда закрыть за ненадобностью, а не стараться его закрыть если его и создать то не удалось rs.close()
try: res_url += "?" + urllib.parse.urlencode({'key': key, 'action': 'get', 'id': id}) rs = urllib.request.urlopen(res_url) res = rs.read() res = res.decode() rs.close() except: print ("Ошибка.") pass
Отредактировано sanodin (Дек. 25, 2013 17:33:38)
Офлайн
20
Сервер ваш? На нём точно выполняется `accept` (socket)? Возможно сервер не успевает море новых соединений обрабатывать (речь о большом промежутке между вызовами `accept`), тогда может помочь параметр в `listen` или переделывание сервера. Попробуйте другой клиент, например telnet (несколько экземпляров). Попробуйте другой сервер.
Вы можете выложить код сервера и клиента урезанные, но достаточные для воспроизведения ошибки? Не куски кода (с точечками), а рабочий код.
..bw
Офлайн