协程
概念:用户层面在一个线程中进行多任务切换的机制, 比线程更加轻量级 实现并发量更大
协程的使用:
使用第三方库: gevent
gevent 是一个基于协程的 python 网络库, 在遇到 IO 阻塞时, 程序会自动进行切换, 可以让我们用同步的放肆写异步 IO 代码
协程的使用:
from gevent import monkey
monkey.patch_all()
# patch 替换破解 替换那些默认能够阻塞当前协程的代码 .recv() .accept() time.sleep() 让协程能狗自动切换
import time
# import gevent
def func(no):
for i in range(5):
print("当前协程正在运行", no)
time.sleep(1)
if __name__ == "__main__":
# 1. 创建并且运行一个协程; 在协程中运行 func 函数 参数1 是协程执行的函数名, 2.... 都是这个函数需要的参数
g1 = gevent.spawn(func, 1111)
g2 = gevent.spawn(func, 2222)
g3 = gevent.spawn(func, 3333)
# 2. 等待协程运行完成
g1.join()
g2.join()
g3.join()
gevent.joinall([g1, g2, g3])
== 协程案例==
# from gevent import monkey
# monkey.patch_all()
from urllib.request import urlopen
import gevent
import time
def down_html(url):
print("开始下载网页" url)
html_data = urlopen(url).read()
print("网页%s下载完成 长度是%s" %(url, len(html_data)))
if __name__ == "__main__":
begin = time.time()
# 创建协程
g1 = genvent.spawn(down_html,"https://www.baidu.com")
g2 = genvent.spawn(down_html,"https://www.jd.com")
g3 = genvent.spawn(down_html,"https://www.taobao.com")
# 等待协程执行完成
genvent.joinall([g1, g2, g3])
end = time.time()
print("时间", end-begin)