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

Python - 协程管理

时间:2021-04-22 16:15:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:任务   pip   port   event   time()   语法   生成   rom   退出   

  1 """
  2 协程:实现多任务的另一种方式;
  3 单线程的并发,又称微线程;
  4 一种用户态的轻量级线程
  5 
  6 特性:
  7 对于协程来说,程序员就是上帝,你想让她执行到哪里,他就执行到哪里--实现任务的任意切换
  8 原理:能够保留上一次调用的状态(生成器也有这个功能)
  9 意义:线程间切换需耗时(保存状态,下次继续),协程只使用一个线程,切换耗费更少的资源。
 10 
 11 应用场景:如果一个线程里面IO操作特别多,协程(与线程相比)的执行效率更高
 12 
 13 """
 14 
 15 
 16 def learn():
 17 
 18     yield 语法
 19     yield 数学
 20     yield 英语
 21 
 22 
 23 def work():
 24 
 25     yield SDR02150
 26     yield SDR02151
 27     yield SDR02152
 28     yield SDR02153
 29 
 30 
 31 if __name__ == __main__:
 32 
 33     t1 = learn()
 34     t2 = work()
 35     #
 36     # print(next(t1))
 37     # print(next(t2))
 38     # print(next(t1))
 39     # print(next(t2))
 40     # print(next(t1))
 41     # print(next(t2))
 42     # print(next(t2))
 43     #
 44     for i in t1:    #生成器本身是迭代器 拥有next(),iter()
 45         print(i)
 46 
 47 
 48 
 49 
 50 """
 51 greenlet:是一个轻量级的协程
 52 
 53 1> 安装模块 pip install greenlet
 54 2> 对象.switch()实现任务的切换
 55 
 56 """
 57 
 58 from greenlet import greenlet
 59 
 60 def eat():
 61     print("eating")
 62 
 63 
 64 def sleepp():   #sleep 可能和其他函数名重复
 65     print("sleeping")
 66 
 67 
 68 g1 = greenlet(eat)
 69 g2 = greenlet(sleepp)
 70 
 71 g1.switch()     #切换到g1运行
 72 g2.switch()     #切换到g2运行
 73 
 74 
 75 
 76 """
 77 
 78 特点:可实现任务的自动切换(遇到PF10),属于主动式切换;
 79 主要模式:gevenlet
 80 安装 pip install gevent
 81 
 82 
 83 1. gevent.spawn(func,1,2,3,x=4,x=5)     # 创建一个协程对象
 84 2. join() 阻塞
 85 3. joinall() 方法的参数是一个协程对象列表,他会等待所有的协程都执行完毕后再退出
 86 
 87 """
 88 
 89 import gevent
 90 import time
 91 # from gevent import monkey
 92 # monkey.patch_all()
 93 
 94 # 打补丁,为了能识别time.sleep()为一个耗时操作,来模拟IO操作
 95 #   功能:模块运行时特换的功能
 96 
 97 def eat():
 98     print("eating")
 99     gevent.sleep(2)
100     # time.sleep(2)
101     print("eating222")
102 
103 
104 def sleepp():   #sleep 可能和其他函数名重复
105     print("sleeping")
106     gevent.sleep(2)
107     # time.sleep(2)
108     print("sleeping222")
109 
110 
111 gevent.joinall([
112     gevent.spawn(eat),
113     gevent.spawn(sleepp)
114 ]
115 )
116 
117 
118 # if __name__ == ‘__main__‘:
119 #     g1 = gevent.spawn(eat)
120 #     g2 = gevent.spawn(sleepp)
121 #
122 #     g1.join()
123 #     g2.join()
124 #
125 #     print("haha")
126 
127 
128 
129 
130 import gevent
131 import time
132 
133 
134 
135 def boy():
136     print("boy   :i have some to you")
137     gevent.sleep(2)
138     print("boy   :i love you")
139 
140 
141 def girl():
142     print("girl  :what?")
143     gevent.sleep(2)
144     print("girl  :please be good at python before love")
145 
146 
147 def people():
148     print("people:what are they talking about ?")
149     gevent.sleep(2)
150     print("people:waooooooooo")
151 
152 
153 
154 t1 = time.time()
155 
156 gevent.joinall([
157     gevent.spawn(boy),
158     gevent.spawn(girl),
159     gevent.spawn(people)
160 ])
161 
162 t2 = time.time()
163 
164 print("the elapsed time:{}".format(t2-t1))
165 
166 
167 # boy   :i have some to you
168 # girl  :what?
169 # people:what are they talking about ?
170 # boy   :i love you
171 # girl  :please be good at python before love
172 # people:waooooooooo
173 # the elapsed time:2.0172317028045654

 技术图片

 

 

Python - 协程管理

标签:任务   pip   port   event   time()   语法   生成   rom   退出   

原文地址:https://www.cnblogs.com/noise/p/14687167.html

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