Форум сайта python.su
0
Добрый вечер/день/etc., на данный момент осваиваю асинхронность, в одном видеокурсе объясняется асинхронность на генераторах и в нем объявляен следующий пример для асинхронной работы с сокетами:
import socket from select import select tasks = [] to_read = {} to_write = {} def server(): serv_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serv_socket.bind(('localhost', 5000)) serv_socket.listen() while True: yield ('read', serv_socket) client_socket, addr = serv_socket.accept() tasks.append(client(client_socket)) def client(client_socket): while True: yield ('read', client_socket) request = client_socket.recv(4096) if not request: break else: yield ('write', client_socket) client_socket.send('Request from the serv_socket..\n'.encode()) client_socket.close() def event_loop(): while any([tasks, to_read, to_write]): while not tasks: ready_to_read, ready_to_write, _ = select(to_read, to_write, []) for sock in ready_to_read: tasks.append(to_read.pop(sock)) for sock in ready_to_write: tasks.append(to_write.pop(sock)) try: task = tasks.pop(0) reason, sock = next(task) if reason == 'read': to_read[sock] = task if reason == 'write': to_write[sock] = task except StopIteration: pass tasks.append(server()) event_loop()
Отредактировано KlauGreph (Дек. 16, 2019 17:02:44)
Офлайн
568
KlauGreph
как работает генератор вы понимаете?
Офлайн
0
FishHook
KlauGrephкак работает генератор вы понимаете?
Отредактировано KlauGreph (Дек. 16, 2019 17:46:03)
Офлайн
0
FishHook
KlauGrephкак работает генератор вы понимаете?
def do_iter(): i = 50 while i > 0: a = 1 b = a-i i += -1 yield b
obj_iter = do_iter() next(obj_iter)
Отредактировано KlauGreph (Дек. 16, 2019 18:02:24)
Офлайн
568
KlauGreph
В данном случае, при вызове функции создается список со всеми элементами до завершения цикла или же они создаются при каждом последующем обращении к объекту генератора?
obj_iter = do_iter()
Офлайн
0
FishHookСпасибо большое, понемногу приходит понимание.
Офлайн
0
FishHookСпасибо огромное, понял, почему это работает - в словари и списки сохраняются состояния, к которым потом обращается пайтон, как бы прокручивая дальше выполнение функции, и скрипт записывает новое состояние в словарь, понял как то вот так. Список tasks тут получается как бы буффером очереди состояний.
Отредактировано KlauGreph (Дек. 16, 2019 22:05:12)
Офлайн