关注公众号“轻松学编程”了解更多。

1、协程

协程,又称微线程,纤程。英文名Coroutine。

协程是啥 ??

首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机,我们可以把一个协程切换到另一个协程,只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。

协程和线程差异

最大的优势就是协程极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

第二大优势协程就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突。

2、使用协程

1.使用greenlet + switch实现协程调度

'''

使用greenlet + switch实现协程调度

'''

from greenlet import greenlet

import time

def func1():

print("开门走进卫生间")

time.sleep(3)

gr2.switch() # 把CPU执行权交给gr2

print("飞流直下三千尺")

time.sleep(3)

gr2.switch()

pass

def func2():

print("一看拖把放旁边")

time.sleep(3)

gr1.switch()

print("疑是银河落九天")

pass

if __name__ == '__main__':

gr1 = greenlet(func1)

gr2 = greenlet(func2)

gr1.switch() # 把CPU执行权先给gr1

pass

输出:

开门走进卫生间

一看拖把放旁边

飞流直下三千尺

疑是银河落九天

2.使用gevent + sleep自动将CPU执行权分配给当前未睡眠的协程

'''

使用gevent + sleep自动将CPU执行权分配给当前未睡眠的协程

'''

import gevent

def func1():

gevent.sleep(1)

print("大梦谁先觉")

gevent.sleep(13)

print("1:over")

pass

def func2():

gevent.sleep(3)

print("平生我自知")

gevent.sleep(9)

print("2:over")

pass

def func3():

gevent.sleep(5)

print("草堂春睡足")

gevent.sleep(5)

print("3:over")

pass

def func4():

gevent.sleep(7)

print("窗外日迟迟")

gevent.sleep(1)

print("4:over")

pass

def simpleGevent():

gr1 = gevent.spawn(func1)

gr2 = gevent.spawn(func2)

gr3 = gevent.spawn(func3)

gr4 = gevent.spawn(func4)

gevent.joinall([

gr1, gr2, gr3, gr4

])

if __name__ == '__main__':

simpleGevent()

pass

输出:

大梦谁先觉

平生我自知

草堂春睡足

窗外日迟迟

4:over

3:over

2:over

1:over

3.通过monkey调度

'''

使用gevent + monkey.patch_all()自动调度网络IO协程

'''

import gevent

import requests

import time

from gevent import monkey

def getPageText(url, order=0):

print("No%d:%s请求开始..." % (order, url))

resp = requests.get(url) # 发起网络请求,返回需要时间——阻塞IO

html = resp.text

print("No%d:%s成功返回:长度为%d" % (order, url, len(html)))

pass

# 将【标准库-阻塞IO实现】替换为【gevent-非阻塞IO实现】

monkey.patch_all()

if __name__ == '__main__':

start = time.time()

time.clock()

# 协程传递参数,(方法名,参数。。。)

gevent.joinall([

gevent.spawn(getPageText, "http://www.sina.com", order=1),

gevent.spawn(getPageText, "http://www.qq.com", order=2),

gevent.spawn(getPageText, "http://www.baidu.com", order=3),

gevent.spawn(getPageText, "http://www.163.com", order=4),

gevent.spawn(getPageText, "http://www.4399.com", order=5),

gevent.spawn(getPageText, "http://www.sohu.com", order=6),

gevent.spawn(getPageText, "http://www.youku.com", order=7),

gevent.spawn(getPageText, "http://www.iqiyi.com", order=8),

])

end = time.time()

print("over,耗时%d秒" % (end - start))

print(time.clock())

pass

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。

如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python使用协程_Python使用协程进行爬虫相关推荐

  1. python 协程_Python多任务协程

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源).为啥说它是一个执行单元,因为它自带CPU ...

  2. python限制进程数_Python连载36-线程数量限制、Timer、可重入锁

    一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 importthreadingimporttime#参数定义了最多几 ...

  3. python写采集程序_Python写的简易采集爬虫(蜘蛛)

    #!/usr/bin/python #-*-coding:utf-8-*- # 简易采集爬虫 #    1.采集Yahoo!Answers,parseData函数修改一下,可以采集任何网站 #    ...

  4. python制作查询网页_Python制作简单的网页爬虫

    1.准备工作: 工欲善其事必先利其器,因此我们有必要在进行Coding前先配置一个适合我们自己的开发环境,我搭建的开发环境是: 操作系统:Ubuntu 14.04 LTS Python版本:2.7.6 ...

  5. python制作简单网页_Python制作简单的网页爬虫

    1.准备工作: 工欲善其事必先利其器,因此我们有必要在进行Coding前先配置一个适合我们自己的开发环境,我搭建的开发环境是: 操作系统:Ubuntu 14.04 LTS Python版本:2.7.6 ...

  6. python实例豆瓣代码_Python制作豆瓣图片的爬虫实例代码

    Python制作豆瓣图片的爬虫 前段时间自学了一段时间的Python,想着浓一点项目来练练手.看着大佬们一说就是爬了100W+的数据就非常的羡慕,不过对于我这种初学者来说,也就爬一爬图片. 我相信很多 ...

  7. python调用chrome插件_Python使用Chrome插件实现爬虫过程图解

    做电商时,消费者对商品的评论是很重要的,但是不会写代码怎么办?这里有个Chrome插件可以做到简单的数据爬取,一句代码都不用写.下面给大家展示部分抓取后的数据: 可以看到,抓取的地址,评论人,评论内容 ...

  8. python 协程和异步的关系_python协程与异步协程

    在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...

  9. python 协程_Python 协程与 Go 协程的区别(一)

    ? "Python猫" ,一个值得加星标的公众号 花下猫语:年关将近,不知各位过得怎样?我最近有些忙,收获也挺多,以后有机会分享下.吃饭时间,追了两部剧<了不起的麦瑟尔夫人& ...

  10. python网络编程库_Python网络编程——协程

    协程的概念 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字 ...

最新文章

  1. HDU 1824 Let's go home
  2. KinectFusion——微软基于KINECT的实时三维重建项目(KINECT)
  3. 测试开发面试准备之HTTP协议-一次完整的Http请求过程
  4. 深入浅出CUDA编程
  5. BundleFusion那些事儿
  6. mysql查看事件任务内容_MySql事件计划任务
  7. IDEA中Git的更新、提交、还原方法
  8. SpringMVC 文件上传
  9. servlet下根据相对路径找资源
  10. Docker从入门到精通 项目实例示范
  11. IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法
  12. mysql 编码utfmb4
  13. Spring MVC的WebMvcConfigurerAdapter用法收集(零配置,无XML配置)
  14. oracle 12c 翻页,Oracle 12c新特性之翻页查询
  15. 一个景点的给input域一个默认值,然后在聚焦的时候清空它 jquery方法
  16. Jobdu 1005
  17. 「WC 2019」数树
  18. 计算机技术在风景园林中的应用和选择,现代信息技术在风景园林中的应用
  19. Design1.CMOS工艺OD门,传输门,三态门原理应用浅析
  20. Excel如何批量添加批注

热门文章

  1. justify-content
  2. jstack命令报错
  3. Doing It in User Space
  4. 一个定时器的普通实现,多进程实现和多线程实现的对比
  5. 高富帅与大公司 续三 自我认知
  6. 百度面试题:从海量日志中提取访问百度次数最多的IP
  7. Arrays和比较器
  8. C# Frequently Asked Questions From The C# team
  9. 并发编程-基础概念介绍
  10. jmeter需要学习的其他点