协程
协程
协程: 协作式,-----非抢占式程序
A----->B----->A----->C
通过A执行执行一段时间,A保存;切换到B---用B执行,B保存;等等。可以自己控制什么时候切换。
协程:又称为微线程。英文是:Coroutine
优点:
-协程极高的执行效率。因为子程序不是线程切换,而是由程序自身控制,因此没有切换线程的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
-不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比线程高很多。
因为协程本质是一个线程执行,那么怎么利用多核CPU呢。最简单的方法是多进程+协程。既充分利用多核,又充分发挥协程的效率,可以获得极高的性能
协程例子如下:
简单例子:例1:
import time
import queue
def consumer(name):
print("--->ready to eat baozi...")
while True:
new_baozi = yield
print("[%s] is eating baozi %s" % (name,new_baozi))
#time.sleep(1)
def producer():
r = con.__next__()#运行生产器
r = con2.__next__()#运行生成器
n = 0
while 1:
time.sleep(1)
print("\033[32;1m[producer]\033[0m is making baozi %s and %s" %(n,n+1) )
con.send(n)#发消息并运行生成器,相当于new_baozi = n
con2.send(n+1)#同上
n +=2
if __name__ == '__main__':
con = consumer("c1")#生成器
con2 = consumer("c2")#生成器
producer()
结果是:
--->ready to eat baozi...
--->ready to eat baozi...
[producer] is making baozi 0 and 1
[c1] is eating baozi 0
[c2] is eating baozi 1
[producer] is making baozi 2 and 3
[c1] is eating baozi 2
[c2] is eating baozi 3
.............
会一直这样运行下去
greenlet协程模块
greenlet 是一个用C实现的协程模块,相比python自带的yield,它可以在任意含义之间随意切换,而不需要把这个函数先声明为生成器。
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print(34)
def test2():
print(56)
gr1.switch()
print(78)
gr1.switch()
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr2.switch()#====>从gr2开始运行
结果是:
56
12
78
34
gevent 模块
gevent 模块会自动切换不用自己每次都设置切换
import gevent
import requests,time
start=time.time()
def f(url):
print('GET: %s' % url)#===》url 是网址
resp =requests.get(url)#此处获得了url,已经爬下来了
data = resp.text #打印爬下的内容
print('%d bytes received from %s.' % (len(data), url))
gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'),
gevent.spawn(f, 'https://www.yahoo.com/'),
gevent.spawn(f, 'https://www.baidu.com/'),
gevent.spawn(f, 'https://www.sina.com.cn/'),
gevent.spawn(f, 'http://www.xiaohuar.com/hua/'),
])
print("cost time:",time.time()-start)
原文地址:https://www.cnblogs.com/wode110/p/15003378.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu19.10 下部署邮件系统
- GitLab 初次搭建使用教程
- Vue中鼠标事件
- gitlab添加ssh-keys之后克隆依然需要输入密码
- VM虚拟机系统自定义分区
- k8s问题记录
- Hexo博客Next主题浏览统计不显示
- 视频上云网关平台EasyCVR使用海康SDK拉流协议分析
- 计算机网络物理层习题
- 从数据库中查询马上过生日的人并统计各年龄段及性别所占的人数
- Ubuntu19.10 中安装 JDK
- 在 Ubuntu19.10 上安装 wine 并安装 QQ 等软件
- wordpress迁移至hugo及其自动化发布文章全记录
- 视频流媒体平台EasyNVR硬件设备使用华科云arm版如何修改为固定IP?
- 详解 IP 地址