Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 02.10.2015
Сообщений: 16

Когда нужно закрывать соединение между сокетами

25.10.2019, 15:09. Показов 4161. Ответов 9

Студворк — интернет-сервис помощи студентам
Имеется приложение на Flask. Также имеется другое приложение, которое в режиме реального времени обрабатывает некоторые данные. Необходимо эти данные вернуть пользователю.

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

Приложение Flask при получении первого GET запроса проверяет доступно ли соединение, если да, то формирует пакет, отправляет его в сокет. Серверный сокет ловит пакет, обрабатывает, возвращает ответ в сокет. Клиентский сокет принимает ответ, обрабатывает, возвращает данные пользователю.

Вопрос: после того, как был обработан GET запрос (т.е. данные от приложения получены и готовы к отправке пользователю) нужно ли закрывать сокет? Или держать соединение до тех пор, пока или web сервер не отключится, либо пока приложение, которое обрабатывает данные не будет приостановлено.

Интервал между запросами на получение данных: от 10 в секунду (0.1 сек) и выше.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2019, 15:09
Ответы с готовыми решениями:

Закрывать или не закрывать соединение, когда скрипт выполняется долго
Добрый день, сегодня баловался с парсером, в нем есть запросы к api так вот там есть ограничение в секунду, естественно я его перешагнул,...

Нужно ли закрывать соединение?
У меня приложение на NodeJS. Нужно ли закрывать соединение каждый раз после запроса или оно само закроется, когда вернет результат? Либо...

Нужно ли закрывать соединение с БД
Добрый день! Подскажите как правильно делать? Из Python выполняю несколько запросов к базе данных Access, как будет правильно -...

9
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
25.10.2019, 15:37
Не могу сказать наверняка, но я слышал, что:

"Открытый порт для "мамкиного Хацкера" - как котику сметанка.
0
1 / 1 / 0
Регистрация: 02.10.2015
Сообщений: 16
25.10.2019, 15:40  [ТС]
Damenikx, сеть локальная.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.10.2019, 17:59
Лучший ответ Сообщение было отмечено Nick0904 как решение

Решение

Странно всё. Ну и ладно.

Объявите переменную сокета и код открытия сокета на удалённый сервис (приложуху) в глобальной области видимости. Для того, чтобы сокет открывался при запуске воркера flask и соединение всегда было установлено.

* Ещё нужно настроить keep-alive, чтобы соединение не разорвалось при простаивании.
* Если соединение всё же разорвалось - восстанавливаем.
* Работу с сокетом лучше обернуть в какой-нибудь класс и давать остальному flask'у пару методов.

В итоге получается, что веб-сервер стартует, каждый воркер поднимает соединение до приложения и держит его.

Всё будет работать при условии, что приложение умеет обрабатывать несколько запросов по одному соединению. То есть послали запрос, а потом (сразу или через несколько секунд) опять послали по этому же сокету.

Добавлено через 5 минут
Я бы использовал для общения между сервисами JSON-RPC или самодельную реализацию. Отлаживать проще (открыл ссылку в браузере или съэмулировал post-запрос).

Добавлено через 49 секунд
Да, тогда второе приложение превращается в мини http-сервер.
1
1 / 1 / 0
Регистрация: 02.10.2015
Сообщений: 16
28.10.2019, 07:05  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Странно всё
если не секрет, что именно? (можно организовать иначе?)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.10.2019, 07:07
Использование сокетов и самопальный бинарный протокол, который фиг отладишь.

Я бы использовал для общения между сервисами JSON-RPC или самодельную реализацию.
1
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
28.10.2019, 08:14
Рыжий Лис, JSON-RPC можно заменить Pyro? Прочитал документацию, очень похож результат, которого можно добиться, используя эти модули.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.10.2019, 08:34
К сожалению, не подскажу. Если считаете, что можно, значит можно.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
28.10.2019, 08:49
Рыжий Лис, последний вопрос, если можно (я ТС).
Т.е. сейчас все выглядит как-то так:
1. JS делает GET запрос web серверу на получение данных
2. Сервер делает запрос приложению. Для этого формирует пакет по (свой протокол) и отправляет в сокет
3. Приложение формирует пакет ответа и отправляет web серверу
4. web сервер отправляет ответ клиенту

Сильно ли отразится использование JSON-RPC на времени ответа, если заменить им обмен данными по сокету?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.10.2019, 09:01
Думаю не сильно. Замерил скорость открытия сокета:
Bash
1
2
# nping --tcp -p 80 localhost
Max rtt: 203.721ms | Min rtt: 17.575ms | Avg rtt: 98.907ms
Что-то много намерил. В любом случае надо проверять и замерять задержки. Если раньше данные кодировались/декодировались в бинарный пакет, то теперь будут в json.

Вопрос целесообразности поддержания открытого соединения остаётся открытым. Можно поэкспериментировать, тот же requests из коробки поддерживает такую фичу.

Excellent news — thanks to urllib3, keep-alive is 100% automatic within a session! Any requests that you make within a session will automatically reuse the appropriate connection!
Note that connections are only released back to the pool for reuse once all body data has been read; be sure to either set stream to False or read the content property of the Response object.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2019, 09:01
Помогаю со студенческими работами здесь

Нужно ли закрывать соединение MySQL
Доброго времени суток. Немного опишу программу. Есть приложение, которое связывается с БД на сервере (бд - MySQl) забирает данные и...

Нужно ли закрывать соединение у myqsli?
Всем привет! Подскажите, нужно ли закрывать соединение после запроса? $data = mysqli_query($link, $query); Как вариант добавить...

StreamReader: когда закрывать поток и нужно ли это делать
Нужно ли закрывать постоянно? sr = new StreamReader("123.txt"); string a = sr.ReadToEnd(); sr.Close(); sr = new...

Нужно на одной странице открыть соединение, и чтобы оно не закрывалось , когда я перехожу на следуюущие страницы.
Добрый день! Подскажите пожалуйста такую штуку... Мне нужно на одной странице открыть соединение, и чтобы оно не закрывалось , когда...

Стоит ли закрывать соединение с БД и тормозит ли это сайт?
Стоит ли вообще закрывать БД? Говорят, база сама закрывается после запросов. И лучше использовать mysql_free_result для освобождения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru