Gevent的介绍
- gevent就是greenlet实现
- gevent是对greenlet的高级封装
- gevent每次遇到io操作,需要耗时等待时,会自动跳到下一个协程继续执行
- gevent的代码风格和线程非常相似,运行之后的效果也非常相似
- 通过monkey patching功能来使得第三方模块变成协作式
- gevent启动的并发协程,具体到task function。不能长时间阻塞。如果有长时间的阻塞io操作,还是传统线程比较好。
- 最好用gevent自身的非阻塞库,如httplib、socket、select等
- genent适合处理大量无阻塞的任务,如果一定要处理阻塞任务,可以用异步实现。
原理
- 将任务函数封装到gevent.spawn
- 初始化的greenlet列表放在数组threads中
- 数列传给genent.joinall函数,gevent.joinall会阻塞当前流程,并执行给定的greenlet
- 执行流程只会在所有greenlet执行完后才会继续进行。