携程在手,说走就走
携程很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')
#安装方法 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的返回值
遇到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('主')