gevent通过greenlet实现轻量级协程,利用monkey patch将标准库函数替换为非阻塞版本,结合事件循环自动调度I/O操作,在单线程中以协作式多任务模拟并发,使开发者能用同步写法编写异步程序,适用于I/O密集型场景。

gevent 是一个基于协程的 Python 网络库,它使用 greenlet 和 libev(或 libuv)事件循环来实现高并发的异步编程。它的核心原理是:在单线程中通过协作式多任务(cooperative multitasking)模拟出“并发”效果,让开发者可以用同步写法写出异步程序。
gevent 的基础是 greenlet,它是 C 实现的轻量级协程,可以看作是用户态的微线程。
例如:
// 创建两个 greenlet 并手动切换 from greenlet import greenletdef test1(): print(1) gr2.switch() print(2)
def test2(): print(3) gr1.switch() print(4)
gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch() // 输出: 1 3 2
Python 标准库中的 socket、time.sleep 等函数是同步阻塞的。gevent 提供了 monkey patch 机制,动态替换这些标准函数为非阻塞版本。
立即学习“Python免费学习笔记(深入)”;
这样,代码看起来是同步的,实际执行是异步的。
gevent 使用 libev 或 libuv 作为底层事件循环,监听文件描述符(如 socket)的状态变化。
这使得你可以这样写代码:
import gevent import requestsdef fetch(url): print(f"GET {url}") resp = requests.get(url) // 看似同步,实际是非阻塞 print(f"{url} -> {len(resp.content)}")
gevent.joinall([ gevent.spawn(fetch, 'https://www.php.cn/link/7f272b86ea4f734837b281ad960be2f7'), gevent.spawn(fetch, 'https://www.php.cn/link/148c2ad42607c372038edd48cad30120') ])
虽然没有 async/await,但两个请求是并发执行的。
gevent 是协作式的,意味着只有当 greenlet 主动让出时,其他协程才有机会运行。
例如:
for i in range(1000000): do_something() if i % 1000 == 0: gevent.sleep(0) // 让出执行权基本上就这些。gevent 的魔力在于把复杂的异步逻辑隐藏在底层,让你用最自然的方式写高并发网络程序,特别适合 I/O 密集型场景,比如爬虫、长连接服务等。不过要注意它不适用于 CPU 密集任务,而且由于 monkey patch 是全局替换,可能与其他库产生兼容问题。
以上就是python gevent的原理分析的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号