python协程

携程在手,说走就走

携程很nb,python的协程也很牛逼

计算机执行单位官方是定义为两类:进程以及线程,一个内存空间可以开辟多条进程,一个进程可以开辟多条线程.

伟大的程序员在其基础上又把单线程定义一个协程单位.协程的主要用处是在线程遇见IO的时候,自动切换线程,充分的运用计算机的CPU.

协程的本质:在单线程下,由用户控制一个任务遇到io阻塞了就切换另一个任务去执行,以此来提升效率.

协程的的特点:必须在单一的线程下实现并发,修改共享数据的话不需要加锁,用户程序里自己保存多个控制流的上下文栈,一个协程遇见io自动转换到其他协程

一般来说协程是用:greenlet函数去完成,

 1 from greenlet import greenlet
 2 
 3 def eat(name):
 4     print('%s eat 1' %name)  #2
 5     g2.switch('taibai')   #3
 6     print('%s eat 2' %name) #6
 7     g2.switch() #7
 8 def play(name):
 9     print('%s play 1' %name) #4
10     g1.switch()      #5
11     print('%s play 2' %name) #8
12 
13 g1=greenlet(eat)
14 g2=greenlet(play)
15 
16 g1.switch('lowen')
greenlet使用方法
#安装方法
pip3 install gevent
 1 g1=gevent.spawn(func,1,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的,spawn是异步提交任务
 2 
 3 g2=gevent.spawn(func2)
 4 
 5 g1.join() #等待g1结束,上面只是创建协程对象,这个join才是去执行
 6 
 7 g2.join() #等待g2结束  有人测试的时候会发现,不写第二个join也能执行g2,是的,协程帮你切换执行了,但是你会发现,如果g2里面的任务执行的时间长,但是不写join的话,就不会执行完等到g2剩下的任务了
 8 
 9 
10 #或者上述两步合作一步:gevent.joinall([g1,g2])
11 
12 g1.value#拿到func1的返回值
gevent使用方法

遇到IO阻塞时会自动切换任务

 1 import gevent
 2 def eat(name):
 3     print('%s eat 1' %name)
 4     gevent.sleep(2)
 5     print('%s eat 2' %name)
 6 
 7 def play(name):
 8     print('%s play 1' %name)
 9     gevent.sleep(1)
10     print('%s play 2' %name)
11 
12 
13 g1=gevent.spawn(eat,'egon')
14 g2=gevent.spawn(play,name='egon')
15 g1.join()
16 g2.join()
17 #或者gevent.joinall([g1,g2])
18 print('')
gevent方法实例
原文地址:https://www.cnblogs.com/lowen107/p/10065634.html