探索eventlet通信机制

探索eventlet通信机制

一、源码解析

对python原生文件打补丁:

import eventlet
eventlet.monkey_patch()

跟踪进入该模块方法:eventlet.patcher#monkey_patch

def monkey_patch(**on):
......

modules_to_patch = []
for name, modules_function in [
	('os', _green_os_modules),
	('select', _green_select_modules),
	('socket', _green_socket_modules),
	('thread', _green_thread_modules),
	('time', _green_time_modules),
	('MySQLdb', _green_MySQLdb),
	('builtins', _green_builtins),
	('subprocess', _green_subprocess_modules),
]:
	if on[name] and not already_patched.get(name):
		modules_to_patch += modules_function()
		already_patched[name] = True
		
......

该方法对某些系统模块进行全局打补丁,使其对Greenthread友好。关键字参数用于指定哪些模块需要打补丁,如果未提供关键字参数,则会对所有默认的模块(如代码所示)打补丁,例如: monkey_patch(socket = True,select = True) 仅对socket和select模块打补丁。大多数参数都是对同名的单个模块进行打补丁,比如操作系统,时间,选择。但是socket例外,它也会对ssl模块(如果存在)打补丁,thread用于对threading、thread、Queue打补丁。说明:多次调用monkey_patch是安全的。

以socket为例:('socket', _green_socket_modules),进入该方法:

def _green_socket_modules():
    from eventlet.green import socket
    try:
        from eventlet.green import ssl
        return [('socket', socket), ('ssl', ssl)]
    except ImportError:
        return [('socket', socket)]

进入socket模块:eventlet.green.socket

__import__('eventlet.green._socket_nodns')
__socket = sys.modules['eventlet.green._socket_nodns']

__all__ = __socket.__all__
__patched__ = __socket.__patched__ + [
    'create_connection',
    'getaddrinfo',
    'gethostbyname',
    'gethostbyname_ex',
    'getnameinfo',
]

在进入eventlet.green._socket_nodns:

__socket = __import__('socket')

__all__ = __socket.__all__
__patched__ = ['fromfd', 'socketpair', 'ssl', 'socket', 'timeout']

可以看到是对python的原生socket模块进行了打补丁:pythonx.x/Lib/socket.py 以socket类为例:python原生的socket.socket()类并替换为了eventlet.greenio.base#GreenSocket类 该补丁类完全兼容原生socket类的API,它还可以识别关键字参数set_nonblocking = True。用来设置socket为非阻塞模式。

class GreenSocket(object):
    # This placeholder is to prevent __getattr__ from creating an infinite call loop
    fd = None

    def __init__(self, family=socket.AF_INET, *args, **
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Eventlet是一个基于Python的网络库,它提供了协程和事件驱动的编程模型,允许开发者使用同步的方式编写异步的代码。Eventlet的核心是绿色线程(greenlet),它允许多个绿色线程在一个线程中并发执行,从而消除了线程切换的开销。 Eventlet支持多种协议,包括TCP、UDP、HTTP、WebSocket等,同时还提供了对其他Python库的集成支持,如MySQL、PostgreSQL、Redis等。Eventlet还提供了一些有用的工具类,如线程池、定时器、协程池等,以及一些方便的函数,如spawn、sleep、wait等,使得编写异步代码变得更加容易。 Eventlet的使用非常简单,只需要导入eventlet库,并使用其提供的函数创建服务器或客户端即可。下面是一个简单的Eventlet服务器示例: ```python import eventlet def handle(client_socket, address): while True: data = client_socket.recv(1024) if not data: break client_socket.sendall(data) pool = eventlet.GreenPool() server_socket = eventlet.listen(('0.0.0.0', 1234)) while True: client_socket, address = server_socket.accept() pool.spawn(handle, client_socket, address) ``` 该示例创建了一个TCP服务器,使用GreenPool来管理绿色线程池,每个客户端连接都会创建一个新的绿色线程来处理。在handle函数中,我们使用recv和sendall函数来接收和发送数据,由于GreenPool会自动切换绿色线程,因此我们可以使用同步的方式编写异步代码。 总的来说,Eventlet是一个功能强大、易用性高的异步网络库,它可以帮助开发者编写高性能、高并发的网络应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值