1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
|
|||||||||||
1 | |||||||||||
Почему flask_socketio.disconnect препятствует завершению потока?12.02.2020, 12:11. Показов 927. Ответов 1
Метки нет (Все метки)
Есть следующая система: [Клиент] - [Веб-сервер] - [Коннектор].
Коннектор - это своего рода промежуточный код между веб-сервером и источником данных. Мне нужно контролировать соединение сервера с коннектором. Если соединение потеряно, я должен уведомить клиента. Связь между веб-сервером и коннектором организована с помощью socketio. Проблема в том, что если коннектор перестает работать, то веб-сервер узнает об этом только через минуту (это в лучшем случае). Я решил, что сервер должен проверять состояние коннектора каждую секунду. Когда коннектор подключается к серверу, запускается фоновая задача. Суть задачи: каждую секунду: 1) фиксировать время; 2) сохранить фиксированное время в стеке; 3) отправить эхо-сообщение на соединитель. (см. server.background_thread) Соединитель принимает эхо-сообщение и метку времени в качестве параметра и отправляет эхо-сообщение на веб-сервер, в качестве параметра он передает полученную метку времени. (см. client.echo) Веб-сервер получает эхо-сообщение, если отметка времени равна последнему значению в стеке, то это значение удаляется из стека. (см. server.on_echo_connector) На веб-сервере на каждой итерации проверяется размер стека (см. Server.background_thread). Если оно больше 5, то это означает, что коннектор не отвечал на эхо-сообщение 5 раз, считаем, что коннектор недоступен. Когда сервер понимает, что коннектор недоступен, необходимо завершить поток, который отправил эхо-сообщения соединителю. Когда размер стека превышает 5, я выхожу из бесконечного цикла и вызываю flask_socketio.disconnect (connector_sid, '/ connector'). После этого вызова ничего не работает (например, print и т.д.) В методе on_disconnect_connector (server) вызывается thread.join() и никогда не завершается. Нужно завершить поток, чтобы при повторном запуске коннектора он успешно подключился, и все началось заново. Как решить эту проблему? Сервер
0
|
12.02.2020, 12:11 | |
Ответы с готовыми решениями:
1
Многопоточность. Создать визуальный объект по завершению потока Породить два потока. По завершению одного (любого) из них второй должен сразу же порождать еще один поток Почему такой айди потока Почему процесс Idle имеет 32 потока Почему не меняется текст заголовка формы из потока |
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
|
|||||||||||
12.02.2020, 21:11 [ТС] | 2 | ||||||||||
Проблема долгого ожидания сервером сообщения о том, что коннектор был отключен, заключается в том, что клиент использует в качестве транспорта
pooling . socketio выполняет автоматический переход на транспорт websocket , если это возможно, а возможно это тогда, и только тогда, когда установлена библиотека websocket-client .
websocket (либо можно сразу указать его в параметрах подключения для клиента). А с websocket информирование сервера о том, что коннектор был отключен, происходит практически мгновенно.Источник
0
|
12.02.2020, 21:11 | |
12.02.2020, 21:11 | |
Помогаю со студенческими работами здесь
2
Почему консоль ждет конца другого потока? Почему 4 потока показывают одинаковый результат с 2 потоками Почему это вызывается из одного и того же потока Почему объект типа std::vector не читается из потока? Почему приостановка потока совершается ДО вывода текста метки? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |