Чтобы уменьшить задержку, мы попытались использовать gevent в нашей программе.Тем не менее, использование acyncio казалось утомительным, так как нам нужно было переписать много кода.
Но использование gevent привело к множеству странных ошибок, таких как [SSL Handshake failed]
.После некоторого копания мы узнали, что наш клиентский приветственный пакет был отправлен более чем через 30 с после успешного установления TCP-соединения.Установка опции do_handshake_on_connect
на True
только изменила имя ошибки.
Позже мы выяснили, что причина для таймаута была в некоторой операции блокировки (DB).По-видимому, сначала были установлены все TCP-соединения, а затем, когда состоялось первое успешное рукопожатие SSL, был возвращен первый результат, и доступ к БД не позволил бы питону выполнить оставшиеся рукопожатия SSL.
Это происходит, как я понимаю, потому что выполнение SSL-рукопожатия (как любая операция с сокетом) немедленно «уступает» (как в asyncio
) другим операциям ввода-вывода, и это непредсказуемо, когда оно будет возобновлено
Итак, как правильно использовать gevent с SSL, обеспечивающим завершение рукопожатия?
![enter image description here](https://i.stack.imgur.com/EopHa.png)