当requests 遇到 gevent.monkey.patch_all(), wrap_socket does not accept server_hostname in python 2.7.x

2 篇文章 0 订阅
1 篇文章 0 订阅

开发环境: python 2.7.x    requests    gevent    并发编程

在并发编程的开发过程中,我们常会在导入socket模块前使用gevent.monkey.patch_all(),以将涉及socket模块的IO设置为非阻塞。

那么问题来了,当requests 遇到 gevent.monkey.patch_all(), 你可以也会遇到这样的异常信息:

TypeError: wrap_socket() got an unexpected keyword argument 'server_hostname'

或者是:

TypeError: __init__() got an unexpected keyword argument 'check_hostname'

当对问题进行深入探究发现, requests是基于urllib3实现的, 此模块中的ssl_.py 使用server_hostname作为参数调用wrap_socket。然后当此方式遇到gevent 中的monkey patched 方式就会出现异常。

查资料发现原因好像是因为SNI相关功能向2.7系列的后退,导致urllib将python 2.7.8+视为python 3.2+而导致的。

我这里的解决方案有三个:

  1. 查看gevent 版本,如果为1.0.2或者更低版本,那么通过升级为更高版本可以避免此异常;
  2. requests 文档中说明如果异步调用,可以使用更高级的模块 grequests,使用此模块进行请求也可以避免此异常,但弊端是此方式需要修改代码的工作量可能比较大;
  3. 通过grequests此模块的源码,发现模块中的实现原理是在gevent.monkey.patch_all()中传入了参数thread=False, select=False, 以避免对threading和select模块的补丁。所以我们在原代码中可以借鉴,直接传入这两个参数,也可以避免此异常;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值