python-协程

概述

协程是什么?

协程是一种用户态的【伪轻量级线程】,即协程是由用户程序自己控制调度的
单线程的异步编程模型就是协程
本质上是一个线程

特点

1,能够在一个线程中实现并发
2,能够规避一些任务中的IO阻塞,在任务的执行过程中,检测到IO阻塞就切换任务
3,在一个线程上,提高CPU的利用率
4,在多个任务之间切换
5,协程比线程切换速度快

 1 def consumer():
 2     while True:
 3         x = yield
 4         print('处理了数据:', x)
 5 
 6 
 7 def producer():
 8     c = consumer()
 9     next(c)
10     for i in range(10):
11         print('生产了数据:', i)
12         c.send(i)
13 
14 
15 producer()
通过代码实现的简单协程.py

greenlet.greenlet模块

方法(greenlet(func)实例化g)

g.switch()  切换到g这个协程上运行

 1 from greenlet import greenlet
 2 
 3 
 4 def eat():
 5     print('start eat')      # 2
 6     g2.switch()             # 3,切换到g2的play()
 7     print('end eat')        # 6
 8     g2.switch()             # 7,切换到g2play()
 9 
10 
11 def play():
12     print('start play')     # 4
13     g1.switch()             # 5,切换到g1的eat()
14     print('end play')       # 8
15 
16 
17 g1 = greenlet(eat)
18 g2 = greenlet(play)
19 
20 g1.switch()                 # 1,切换到g1的方法eat
通过greenlet实现协程.py

gevent模块

遇到gevent能识别的/O阻塞,程序会【自动】进行任务(协程)切换,实现并发效果

识别其他模块的阻塞

需要打打补丁:from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前

方法

spawn()       开始一个协程

join()      等待协程执行结束

joinall(g_list)   for循环g_list执行里面的g对象join  # g_list 是一个可迭代参数,里面存着所有需要join的g对象 

属性

value    拿到协程的结果

 1 from gevent import monkey; monkey.patch_all()
 2 import time
 3 import gevent
 4 
 5 
 6 def eat():
 7     print('start eat')
 8     time.sleep(1)           # 遇到阻塞,自动切换到另一个协程
 9     print('end eat')
10     return 9
11 
12 
13 def play():
14     print('start play')
15     time.sleep(1)           # 遇到阻塞,自动切换到另一个协程
16     print('end play')
17 
18 
19 g1 = gevent.spawn(eat)      # 开始一个协程
20 g2 = gevent.spawn(play)     # 开始另一个协程
21 
22 g1.join()       # 等待协程结束
23 g2.join()
24 
25 print(g1.value)     # g1的返回值
通过gevent实现协程.py
 1 from gevent import monkey;monkey.patch_all()
 2 import gevent
 3 import time
 4 
 5 
 6 def task():
 7     time.sleep(1)
 8     print(12345)
 9 
10 
11 def sync():
12     for i in range(10):
13         task()
14 
15 
16 def async():
17     g_lst = []
18     for i in range(10):
19         g = gevent.spawn(task)
20         g_lst.append(g)
21     gevent.joinall(g_lst)       # for循环g_lst执行join
22 
23 
24 async()     # 异步
25 # sync()      # 同步
同步与异步的区别.py

 

posted @ 2018-09-06 09:24  孙昌恒  阅读(148)  评论(0编辑  收藏  举报