Python 协程简介

协程介绍

协程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阻塞,不会释放GIL锁,而 time.sleep 会释放
	
代码示例

		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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值