首页 > 解决方案 > SSL 握手和 gevent

问题描述

为了减少延迟,我们尝试在程序中使用 gevent。然而,使用 acyncio 似乎很乏味,因为我们需要重写很多代码。

但是使用 gevent 会产生很多奇怪的错误,例如[SSL Handshake failed]. 经过一番挖掘,我们发现,我们的 Client hello 数据包在 TCP 连接成功建立后的大约 30 秒后被发送。将do_handshake_on_connect选项设置为True仅更改错误的名称。

后来我们发现,超时的原因是某些阻塞操作(DB)。显然,首先建立了所有 TCP 连接,然后,当第一次成功的 SSL 握手发生时,返回第一个结果,并且 DB 访问将阻止 python 执行其余的 SSL 握手。

据我了解,发生这种情况是因为进行 SSL 握手(作为套接字上的每个操作)立即“让步”(如 in asyncio)到其他 io 操作,并且何时恢复它是不可预测的

那么,如何正确使用带有 SSL 的 gevent 来确保握手完成呢?

在此处输入图像描述

标签: pythonpython-3.xsslasynchronousgevent

解决方案


推荐阅读