码迷,mamicode.com
首页 > 编程语言 > 详细

进程_线程 之(六) --- 协程

时间:2019-08-20 01:23:42      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:span   区别   原理   display   应用   安装   greenlet   text   顺序   

协程简介

区别:线程和进程的操作是由程序触发系统接口,执行者是系统;协程的操作则是程序员。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协成的原理:利用一个线程,分解一个线程成为多个微线程,注意此时从程序级别来分解的

适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

实现技术

需要手动安装 greenlet模块gevent模块。安装gevent模块会默认安装greenlet模块

基于底层greenlet实现

 1 from greenlet import greenlet
 2 
 3 def test1():
 4     print(1,2)      # 2.执行输出语句,输出1,2
 5     gr2.switch()    # 3.执行完上面输出语句后,此行调用test2函数  
 6     print(3,4)        # 6.执行输出语句,输出3,4
 7     gr2.switch()     # 7.执行完上面输出语句后,此处调用test2函数
 8 
 9 def test2():
10     print(5,6)     # 4.执行输出语句,输出5,6
11     gr1.switch()     # 5.执行完上面输出语句后,此行调用test1函数
12     print(7,8)     # 8.执行输出语句,输出7,8
13 
14 gr1 = greenlet(test1) # 1.调用grl1对应的test1函数
15 gr2 = greenlet(test2)
16 gr1.switch()

 

技术图片
1 1,2
2 5,6
3 3,4
4 7,8
输出结果

 基于底层gevent实现

 1 import gevent
 2 
 3 def foo():
 4     print(Running in foo)
 5     gevent.sleep(0)
 6     print(Explicit context switch to foo again)
 7 
 8 def bar():
 9     print(Explicit context to bar)
10     gevent.sleep(0)
11     print(Implicit context switch back to bar)
12 
13 gevent.joinall([
14     gevent.spawn(foo),
15     gevent.spawn(bar),
16 ])
技术图片
1 Running in foo
2 Explicit context to bar
3 Explicit context switch to foo again
4 Implicit context switch back to bar
输出结果

实例

 1 from gevent import monkey; monkey.patch_all()
 2 import gevent
 3 import requests
 4 
 5 def f(url):
 6     print(GET: %s % url)
 7     resp = requests.get(url)
 8     data = resp.text
 9     print(%d bytes received from %s. % (len(data), url))
10 
11 gevent.joinall([
12         gevent.spawn(f, https://www.python.org/),
13         gevent.spawn(f, https://www.yahoo.com/),
14         gevent.spawn(f, https://github.com/),
15 ])
技术图片
1 GET: https://www.python.org/
2 GET: https://www.yahoo.com/
3 GET: https://github.com/
4 431218 bytes received from https://www.yahoo.com/.
5 25529 bytes received from https://github.com/.
6 47394 bytes received from https://www.python.org/.
输出结果

 

进程_线程 之(六) --- 协程

标签:span   区别   原理   display   应用   安装   greenlet   text   顺序   

原文地址:https://www.cnblogs.com/TMMM/p/10786226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!