Python 之 gevent
bingfeng
发布于 2020-9-29 17:04
浏览
0收藏
简介
Python 脚本执行的时候不是很快,特别是 Python 下面的多线程机制,长久以来一直被大家所诟病。通常来说要让 Python 执行效率变高一般使用的方法包括:
- 将复杂的代码转由 C 等执行效率更高的语言完成
- 多进程并发执行
- 用多线程完成 IO 操作
- 使用 gevent 协程机制
本篇将简单介绍一下协程。
协程的基本原理
gevent 的基本原理来自于 libevent&libev。本质上 libevent 或者说 libev 都是一种事件驱动模型。这种模型对于提高 CPU 的运行效率,增强用户的并发访问非常有效。但是因为它本身是一种事件机制,所以写起来有点绕,不是很直观。所以,为了修正这个问题,有心人引入了用户侧上下文切换的机制。这就是说,如果代码中引入了带 IO 阻塞的代码时,lib 本身会自动完成上下文的切换,全程用户都是没有觉察的。这就是 gevent 的由来。
gevent 是一个第三方库,可以轻松通过 gevent 实现并发同步或异步编程。
使用
实例1:
分类
标签
已于2020-9-29 17:04:07修改
赞
收藏
回复
4
相关推荐
上面的例子中 gevent.sleep(2) 是模拟 gevent 中可以识别的 IO 阻塞,遇到IO阻塞时会自动切换任务。
延时操作
而 time.sleep() 或其它的阻塞,gevent 是不能直接识别的,需要下面一行代码,打补丁识别。
这一行代码必需放在打补丁者的最前面。
实例2:
锁操作
虽然是协程,但是在里面添加锁增加对共享资源的互斥访问也是非常重要的,此外锁本身的添加也是很简单的。
使用锁可以防止其中之间的互斥访问。
案例
如何通过 gevent 来实现一个单线程下的socket并发?
服务端:
客户端:
再此给出程序源码