You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
поток [ <-> ] протокол (SSL)[ <-> ] транспорт (socket)
| ^
+......................................+
дополнительное владение через ссылку
[переместить SSL из транспорта в протокол мы не можем - старый сокет перестаёт работать]
[сейчас поток может сменить транспорт не более одного раза]
[при замене класса мы сообщаем об этом все четырём сторонам избегая рекурсии с вызывающей стороны]
[для обратной совместимости проверяем, является ли принятый класс потомком старого и если да, передаём ему обёртки]
Задача - завершить работу протокола, забрав транспорт.
1 Добавить shutdown_tls в loop
2 Написать поточную обёртку поверх
I cannot connect the loose ends in the code to get how to shutdown and whether a socket can be taken before a final shutdown
self._sslobj.unwrap() закопан внутри SSLProtocol и необходимо архитектурно грамотно вытащить значение за пределы класса не прорубая
окна.
=========================
Разбираюсь:
кто поверх кого (транспорт или протокол)
TCP, UDP и тем более TLS (в реализации Питоновского пакета ssl это сокет) - это внутренняя деталь транспорта.
С точки зрения пользователя существует только поточное и пакетное взаимодействие в один или несколько потоков.
Несколько потоков - это, например, процессы, владеющие stdin и stdout. Вот только это дело не протокола (каждый
поток - это обычный pipe), а loop.subprocess_*, возвращающего кортеж из трёх потоков
кто взаимодействует с буферами, а кто с протоколами
какова роль протокола, если буферизацию определяет ресурс, оборачиваемый классом транспорта, а способ получения
данных - очередь сообщений (poll vs proactor)
не задокументировано, то есть пользователю не видно
встречаются в имени параметра protocol_factory функций цикла
гипотеза: протокол позволяет прозрачно заменить нижележащий сокет; но ради этого там
масса слабосвязанной лапши, крутящейс вокруг внутренних переменных.
asyncio.stream.start_server вызывает loop.create_server с фабрикой следующего вида:
def factory():
reader = StreamReader(limit=limit, loop=loop)
protocol = StreamReaderProtocol(reader, client_connected_cb,
loop=loop)
return protocol
return await loop.create_server(factory, host, port, **kwds)
то есть протокол смотри на пользователя, а транспорт - на низкоуровневый поток ввода-вывода.
Зачем тогда TLS-протокол, если схема взаимодействия такая же, как и с сокетом.
The text was updated successfully, but these errors were encountered:
[переместить SSL из транспорта в протокол мы не можем - старый сокет перестаёт работать]
[сейчас поток может сменить транспорт не более одного раза]
[при замене класса мы сообщаем об этом все четырём сторонам избегая рекурсии с вызывающей стороны]
[для обратной совместимости проверяем, является ли принятый класс потомком старого и если да, передаём ему обёртки]
Задача - завершить работу протокола, забрав транспорт.
1 Добавить shutdown_tls в loop
2 Написать поточную обёртку поверх
I cannot connect the loose ends in the code to get how to shutdown and whether a socket can be taken before a final shutdown
self._sslobj.unwrap() закопан внутри SSLProtocol и необходимо архитектурно грамотно вытащить значение за пределы класса не прорубая
окна.
=========================
Разбираюсь:
С точки зрения пользователя существует только поточное и пакетное взаимодействие в один или несколько потоков.
Несколько потоков - это, например, процессы, владеющие stdin и stdout. Вот только это дело не протокола (каждый
поток - это обычный pipe), а loop.subprocess_*, возвращающего кортеж из трёх потоков
данных - очередь сообщений (poll vs proactor)
У нас есть транспорты и протоколы.
Ответы:
Создание (т. е. кто в принципе в курсе):
транспорт:
протоколы:
не задокументировано, то есть пользователю не видно
встречаются в имени параметра protocol_factory функций цикла
гипотеза: протокол позволяет прозрачно заменить нижележащий сокет; но ради этого там
масса слабосвязанной лапши, крутящейс вокруг внутренних переменных.
asyncio.stream.start_server вызывает loop.create_server с фабрикой следующего вида:
def factory():
reader = StreamReader(limit=limit, loop=loop)
protocol = StreamReaderProtocol(reader, client_connected_cb,
loop=loop)
return protocol
return await loop.create_server(factory, host, port, **kwds)
то есть протокол смотри на пользователя, а транспорт - на низкоуровневый поток ввода-вывода.
Зачем тогда TLS-протокол, если схема взаимодействия такая же, как и с сокетом.
The text was updated successfully, but these errors were encountered: