Python 协程简介

Python 协程简介,第1张

文章目录
      • 协程介绍
      • 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继续执行。也就是在单线程执行并发。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/717987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存