Есть ли возможность организовать не блокирующее ожидание соединения в Socket + Python? Micropython (python3)
На стадии socket.accept() программа подвисает на этом моменте и мне это не допустимо.
Есть внутри цикл с основной логикой while True: который прерывать нельзя.
Так вот вопрос. Можно ли внутри цикла while True: отследить подключение и передать в функцию обработчика , чтоб та ответила клиенту, но цикл на стадии ожидания соединения не прерывать?

21 Авг 2019 в 06:39
232 +1
0
Ответы
1

Да, можно организовать не блокирующее ожидание соединения в Socket + Python, используя асинхронный ввод-вывод (Asynchronous I/O).

В Micropython (Python 3) вы можете использовать модуль uasyncio для организации асинхронного ввода-вывода. Этот модуль предоставляет возможность запускать несколько задач одновременно, что позволяет не блокировать основной цикл программы.

Пример использования uasyncio для не блокирующего ожидания соединения:

import uasyncio as asyncio
import usocket as socket
async def handle_client(reader, writer):
data = await reader.read(100)
response = "Hello, client!"
await writer.awrite(response)
async def accept_clients(server):
while True:
client_sock, _ = server.accept()
reader, writer = client_sock.makefile('rwb')
asyncio.create_task(handle_client(reader, writer))
async def main():
server = socket.socket()
server.bind(("0.0.0.0", 8080))
server.listen(5)
asyncio.create_task(accept_clients(server))
while True:
await asyncio.sleep_ms(1000) # основной цикл без блокировки
asyncio.run(main())

В этом примере цикл "while True" основной логики программы не блокируется на стадии ожидания соединения. Функция handle_client обрабатывает данные от клиента, а функция accept_clients принимает новые соединения и передает их на обработку.

20 Апр 2024 в 13:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир