协程简介
又称为微进程,纤程。非抢占式使用资源。
优点
优点1:
协程极高的执行效率。因为子程序切换不是纤程切换,而是由程序自身控制,因此,没有纤程切换的开销,和多线程对比,纤程数量越多,协程的性能优势就越明显。
优点2:
不需要多线程的锁机制,因为只有一个线程,也不存在同事写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
用途
多线程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的新能
协程切换
#-*- coding:utf-8 -*-
from greenlet import greenlet
def test1():
print(12)
gr2.switch() #切换对象切换到 [gr2] 对象
print(34)
gr2.switch()
def test2():
print(56)
gr1.switch() #切换对象切换到 [gr1] 对象
print(78)
gr1 = greenlet(test1) # test1 函数的协程对象 gr1
gr2 = greenlet(test2) # test2 函数的协程对象 gr2
gr2.switch()
56
12
78
gevent模块协程测试
单线程执行爬虫测试
#-*- coding:utf-8 -*-
import requests,gevent,time
start = time.time()
def f(url):
print("GET:%s" % url)
resp = requests.get(url) #获取URL
data = resp.text #URL中的数据
print("%s 的文件大小为%s"%(url,len(data))) #计算大小
f('http://www.python.org')
f('https://www.centos.org//')
f('http://zhaojunhui.cn/')
f('http://www.taobao.com/')
f('http://www.jd.com/')
f('http://www.sdo.com/')
print("运行时间",time.time() - start)
GET:http://www.python.org
http://www.python.org 的文件大小为48758
GET:https://www.centos.org//
https://www.centos.org// 的文件大小为20842
GET:http://zhaojunhui.cn/
http://zhaojunhui.cn/ 的文件大小为714
GET:http://www.taobao.com/
http://www.taobao.com/ 的文件大小为132353
GET:http://www.jd.com/
http://www.jd.com/ 的文件大小为122571
GET:http://www.sdo.com/
http://www.sdo.com/ 的文件大小为12383
运行时间 3.820824384689331
gevent模块多线程协程测试[内容越多效果越明显]
#-*- coding:utf-8 -*-
import requests,gevent,time
start = time.time()
def f(url):
print("GET:%s" % url)
resp = requests.get(url) #获取URL
data = resp.text #URL中的数据
print("%s 的文件大小为%s"%(url,len(data))) #计算大小
gevent.joinall([
gevent.spawn(f,"http://www.python.org"),
gevent.spawn(f,"https://www.centos.org/"),
gevent.spawn(f,"http://www.zhaojunhui.cn"),
gevent.spawn(f,"http://www.taobao.com"),
gevent.spawn(f,"http://www.jd.com"),
gevent.spawn(f,'http://www.sdo.com/')
])
print("运行时间",time.time() - start)
GET:http://www.python.org
http://www.python.org 的文件大小为48758
GET:https://www.centos.org/
https://www.centos.org/ 的文件大小为20842
GET:http://www.zhaojunhui.cn
http://www.zhaojunhui.cn 的文件大小为714
GET:http://www.taobao.com
http://www.taobao.com 的文件大小为132353
GET:http://www.jd.com
http://www.jd.com 的文件大小为122571
GET:http://www.sdo.com/
http://www.sdo.com/ 的文件大小为12383
运行时间 3.0470935821533203