定义: 纤程,微线程。协程的本质是一个单线程程序,所以协程不能够使用计算机多核资源。
作用:
能够高效的完成并发任务,占用较少的资源,因此协程的并发量较高
原理:通过记录应用层的上下文栈区,实现在运行中进行上下文跳转,达到可以选择性的运行想要运行的部分,
以此提高程序的运行效率
优点:
1 消耗资源少
2 无需切换开销
3 无需同步互斥
4 IO并发性好
缺点:
1 无法利用计算机多核
yilde --> 协程实现的基本关键字
有两个 第三库可以实现协程
1 greenlet
g = greenlet.greenlet()
g.switch() 选择要执行的协程事件

import greenlet def a_1(num): print('1',num) g2.switch() print('2') g2.switch() def a_2(): print('3') g1.switch() print('4') g1 = greenlet.greenlet(a_1) g2 = greenlet.greenlet(a_2) g1.switch(10)
2 gevent
1 将协程事件封装为函数
2 生成协程对象
gevent.spawn(func,argv)
功能:生成协程对象
参数: func 协程函数
argv 给协程函数传参
返回值:返回协程对象
3 回收协程:
gevent.joinall()
功能:回收协程
参数:列表 将要回收的协程放入列表
geventt.sleep()
功能:设置协程阻塞,让协程跳转
参数:n 阻塞时间

import gevent,time def foo(a,b): print(a,b,'这是A,B') gevent.sleep(2) print('foo,again') def bar(): print('run...') gevent.sleep(3) print('run bar againg') f = gevent.spawn(foo,1,2) g = gevent.spawn(bar) time.sleep(2) print('----') gevent.joinall([f,g])
from gevent import monkey
monkey.patch_all()
功能:修改套接字的IO阻塞行为
*必须在socket导入之前使用
下文介绍是进程和协程一起使用示例
https://blog.csdn.net/zhongbeida_xue/article/details/53406915#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1 python中多进程+协程的使用以及为什么要用它