Python - асинхронные процессы

{title}

В тот момент, когда мы вступаем в мир множественной обработки, серверов и различных запросов, мы должны знать, что существует несколько типов ответов или поведений, синхронных и асинхронных .
Во-первых, обслуживать запрос, основанный на теории очередей, fifo, lifo и т. Д. То есть до тех пор, пока процесс не будет завершен, это не случится с другим, видя такое поведение, это не будет проблемой для программы, которая обрабатывает потоки, так как она может генерировать несколько потоков для каждого запроса, который обслуживает определенные функции.
Тогда у нас есть асинхронный, который служит нам для ответа одним и тем же потоком на несколько запросов в зависимости от их статуса, поэтому, если несколько запросов выполняются, когда один обрабатывает что-то, мы можем посетить следующий или, возможно, нам даже не нужно ждать отправки запроса. данные клиента:

{title}


Как мы видим на изображении, симуляция операции чата выполняется там, где она просматривается, пока не появится сообщение для передачи.
Асинхронные процессы ввода и вывода
Когда мы выполняем асинхронное чтение запросов клиента, нам нет необходимости выполнять полное чтение сообщения изначально, если нет, то мы можем видеть постепенно, благодаря скорости обработки.
Для асинхронной работы в Python у нас есть две функции, которые могут помочь нам: одна - select, а другая - poll, последняя из которых доступна только для сред UNIX, поэтому это может быть условием, что мы устанавливаем ограничение, если хотим однако, многоплатформенная программа - это решение, которое лучше всего масштабируется, поэтому мы должны принять во внимание эти детали.
Функция выбора принимает 3 последовательности в качестве обязательных аргументов, с четвертым аргументом, который является необязательным и который содержит время ожидания в секундах. Последовательности - это соединения, которые мы будем ждать, поскольку 3 соответствуют следующему: вход, выход, исключительные условия (ошибки, исключения и т. д.).
Если мы не указываем тайм-аут, функция выбора будет ждать, пока одна из последовательностей не будет готова к действию, в противном случае, если мы укажем тайм-аут, блоки будут ждать соответствующего времени. Значения, возвращаемые функцией, представляют собой активное подмножество каждой последовательности, например, первая возвращенная последовательность будет входной последовательностью, где нам будет что почитать.
Давайте рассмотрим следующий пример кода о том, как реализовать сервер с помощью функции select :
 импортировать сокет, выберите s = socket.socket () host = socket.gethostname () port = 1234 s.bind ((host, port)) s.listen (5) входных данных = [s], в то время как True: [b] rs, ws, es = select.select (входы, [], []) [/ b] для r в rs: если r равно s: c, addr = s.accept () print 'Получил соединение от', addr input.append (c) else: try: data = r.recv (1024) отключено = нет данных, кроме socket.error: disconnected = True, если отключено: выведите r.getpeername (), «отключено» input.remove (r) else: напечатайте данные 

Как мы видим, когда мы вызываем функцию select, передающую 3 обязательные последовательности, мы передаем переменную input, которая связана с тем, что сервер захватывает во время прослушивания порта 1234 TCP, затем выполняем итерацию для отображения информации.
Как мы видим, этот аспект реализации довольно прост, и предел будет определяться нашим творческим потенциалом при создании программы.

  • 0