python - 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 来确保握手完成呢?
解决方案
推荐阅读
- opencpu - 当我使用 wait=FALSE 调用 system() 时进程终止
- python - 似乎无法让我的程序停止抛出无效语法
- angular - 不使用成功/失败块的角度嵌套 HTTP 调用
- java - 在java中动态选择要更新的字段
- .net-core - 在 automapper 中添加服务(注入)
- python - Pandas TypeError: aggregate() 至少需要 2 个参数(1 个给定)
- html - 下拉引导移动我的导航栏的所有项目
- jenkins-pipeline - Yocto,将变量导出到主机
- javascript - 使用javascript在浏览器中进入和退出全屏
- bash - 如何使用外壳“if”条件设置标志