最近在做xmpp相关项目。使用gevent和pyxmpp2。
多进程+gevent协程,效果还是不错。
但是打上patch_socket()就会出现问题,如果SRV域名的A记录已存在的话,将会直接解析起A记录。
举个例子:
SRV:_xmpp-client._TCP.gmail.com SRV 20 0 0 talk.l.gmail.com
A:gmail.com A 79.18.125.19
当patch_socket()后,就会直接解析gmail.com A记录到 79.18.125.19,而不是解析talk.l.gmail.com.
gmail.com并没有5222端口提供xmpp服务,因此消息会发送失败。
阅读pyxmpp2源码和gevent文档发现:
pyxmpp2.transport._connect()中解析地址会先flag=socket.AI_NUMERICHOST 强制使用IP地址方式,失败之后才会尝试SRV解析。
而gevent.socket文档明确说明getaddrinfo会忽略flag参数:
Differs in the following ways:
raises DNSError (a subclass of gaierror) with libevent-dns error codes instead of standard socket error codes
flags argument is ignored
for IPv6, flow info and scope id are always 0
因此,patch_socket()且gmail.com存在A记录的时候,gevent.socket将会解析成功,并且返回使用。
解决方法:
import gevent
from gevent import monkey
monkey.patch_socket( dns = False, aggressive = True )
patch时加dns=False,不使用gevent.socket dns相关方法,使pyxmpp2.transport中connect函数flag=socket.AI_NUMERICHOST生效,方法包括:
__dns__ = ['getaddrinfo',
'gethostbyname',
'gethostbyname_ex',
'gethostbyaddr',
'getnameinfo',
'getfqdn']
一般来说并不会影响patch_socket性能,毕竟只是dns解析还是使用python.socket而已。
特此分享,不走弯路。
分享到:
相关推荐
遇到阻塞自动切换协程,程序启动时执行monkey.patch_all()解决 # 由于IO操作非常耗时,程序经常会处于等待状态 # 比如请求多个网页有时候需要等待,gevent可以自动切换协程 # 遇到阻塞自动切换协程,程序启动时...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
资源分类:Python库 所属语言:Python 资源全名:gevent-20.6.2-cp36-cp36m-manylinux2010_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:gevent-21.1.2-cp38-cp38-win32.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:gevent-1.5a4-cp35-cp35m-manylinux2010_x86_64.whl
monkey.patch_all() # 在导入需要阻塞 的模块 之前执行, 执行脚本,修改socket 阻塞 from socket import * 创建 TCP 套接字 s = socket() s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 可重复使用端口号 s.bind...
这是一个简单的Python脚本,主要从懒人图库下载JavaScript特效模板,在脚本中使用了gevent这个第三方...gevent.monkey.patch_socket() ''' Description:Python 爬虫抓取懒人图库的JS脚本模板 Author:admin Create-Dat
第10周-第09章节-Python3.5-协程Gevent.avi
greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点。本项目受到gevent, openresty, alilua, skynet, clowwindy/ssloop的启发,在此...
python3.8版本的gevent wheel文件,pip安装某个库失败的时候,如果提示gevent安装失败,可以用这个wheel文件安装
离线安装包,测试可用。使用 pip install [完整包名] 进行安装
gevent安装包,适用于使用协程的python代码,具体代码协程demo可看python栏目的协程
from gevent.queue import Queue import gevent,time,csv,requests #时间戳 sta=time.time() #c创建文档 file=open(r’food_calorie1.csv’,‘w’,newline=’’,encoding=‘utf-8’) writer=csv.writer(file) #获得...
opacity: .2, fillColor: "#000", border: "2px solid blue" }; var style = this.globals.style; for (var s in opts_boxStyle) { style[s]=opts_boxStyle[s]; } var borderStyleArray = style.border....
建立在gevent和请求上。 从 1.0.0 版本开始,使用这个库的代码必须做 from gevent import monkey monkey . patch_all () 或其他一些patch_ *函数的选择,以在导入该库之前准备gevent。 正式支持Python 3。 测验...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
资源来自pypi官网。 资源全名:helics-2.6.0-cp37-cp37m-manylinux2010_x86_64.whl
Gevent指南.pdf
python库。 资源全名:gevent-websocket-0.9.4.tar.gz