协程以及在Python中如何实现协程_Python爬虫开发基础

时间:2018-08-18 17:26:34   来源:上海尚学堂   阅读:

一、协程

协程(coroutine),又称微线程,纤程,是一种用户级的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,每次过程重入时就相当于进入上一次调用的状态。在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源。

协程需要用户自己来编写调度逻辑,对于CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。那么在Python中是如何实现协程的呢?

二、在Python中实现协程

Python通过yield提供了对协程的基本支持,但是不完全,而使用第方gevent库是更好的选择,gevent提供了比较完善的协程支持。gevent是一个基于协程的Python网络函数库,使用 greenlet在libev事件循环顶部提供了一个有高级别并发性的API.主要特性有以下几点:

◆ 基于libev的快速事件循环,Linux上是epoll机制。
◆ 基于greenlet的轻量级执行单元。
◆ API复用了Python标准库里的内容。
◆ 支持SSL的协作式sockets .
◆ 可通过线程池或c-ares实现DNS查询。
◆ 通过monkey patching功能使得第三方模块变成协作式。

gevent对协程的支持,本质上是greenlet在实现切换工作。greenlet工作流程如下:假如进行访问网络的IO操作时,出现阻塞,greenlet就显式切换到另一段没有被阻塞的代码段执行,直到原先的阻塞状况消失以后,再自动切换回原来的代码段继续处理。因此,greenlet是一种合理安排的串行方式。

下图是协程的优缺点



《Python爬虫开发与项目实战》基础篇--协程,上海Python培训整理,范传辉著。
更多推荐阅读:
什么是网络爬虫?为什么要学习网络爬虫》;
【零基础学Python爬虫】Python函数与控制语句》;
【零基础学Python爬虫】Python字符串方法》等......
分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫