- 协程介绍
- Greenlet 模块
协程Coroutine: 是单线程下的并发,又称微线程,纤程。协程是一种用户态的轻量级线程,即协程是由用户
程序自己控制调度的
协程特点:
必须在只有一个单线程里实现并发
修改共享数据不需加锁
用户程序里保存多个控制流的上下文栈
附加:一个协程遇到IO *** 作自动切换到其它协程(用到了gevent模块(select机制))
知道了进程是资源分配的最小单位,线程是CPU调度的最小单位。利用进程和线程算是提高了不少cpu的利用率
但是对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(只利用一个
cpu)情况下实现并发。这样就可以节省创建线程所消耗的时间。所以有了协程的由来。
在线程遇到I/O *** 作等阻塞或者占用CPU时间过长时,CPU会切走。但可以通过代码来检测程序的IO *** 作并自己
处理,让CPU感觉不到IO的存在从而最大幅度的占用CPU,这就是协程的原理。不过 *** 作系统还是只认识进程和
线程。
Greenlet 模块
Gevent 是一个第三方库,可以在pycharm直接下载
在这里使用的方法:
g1=gevent.spawn():创建一个协程对象g1,括号内第一个参数是函数名后面可以是位置实参或关键字
实参,都是传给函数eat的
g1.join():等待g1结束
gevent.joinall([g1]):等待g1结束
g1.value:拿到func1的返回值
gevent.sleep(2):模拟gevent可以识别的io阻塞
代码示例
from gevent import spawn
import time
from gevent import monkey;monkey.patch_all() # 固定编写 用于检测所有的IO *** 作
def play(name):
print('%s play 1' % name)
time.sleep(5)
print('%s play 2' % name)
def eat(name):
print('%s eat 1' % name)
time.sleep(3)
print('%s eat 2' % name)
start_time = time.time()
g1 = spawn(play, 'XWenXiang') # 创建协程对象
g2 = spawn(eat, 'XWenXiang') # 创建协程对象
g1.join() # 等待检测任务执行完毕
g2.join() # 等待检测任务执行完毕
print('总耗时:', time.time() - start_time)
1. 示例中导入了模块monkey,可以将这句话当成固定语句记忆,用于检测所有io *** 作。或者使用
gevent.sleep(2)来模拟gevent可以识别的io阻塞。
2. 如果不使用协程按照串行的方式示例代码需要8秒多才能结束,使用了协程之后代码控制切换,
让CPU继续执行。也就是在单线程执行并发。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)