zoukankan      html  css  js  c++  java
  • 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方法实例
  • 相关阅读:
    HDU 2602 Bone Collector (01背包)
    POJ 3624 Charm Bracelet (01背包)
    人见人爱A^B
    算菜价 HDU_2090
    Stride Convolution
    PaddingValid convolutionsSame convolutions
    Latex修改局部字体大小
    端到端的深度学习
    多任务学习(multi-task learning)
    迁移学习(Transfer learning)
  • 原文地址:https://www.cnblogs.com/lowen107/p/10065634.html
Copyright © 2011-2022 走看看