zoukankan      html  css  js  c++  java
  • yield实现 coroutine协程案例

    yield可以手工实现协程,但python为我们封装了一个greenlet,先看看yield实现,yield需要手工操作,无法实现IO操作时自动切换协程,greenlet是封装好的,能方便使用io切换!

    import time

    import queue
    def consumer(name):
        print("--->starting eating baozi...")
        while True:
            new_baozi = yield
            print("[%s] is eating baozi %s" % (name,new_baozi))
            #time.sleep(1)
     
    def producer():
     
        = con.__next__()
        = con2.__next__()
        = 0
        while n < 5:
            +=1
            con.send(n)
            con2.send(n)
            print("33[32;1m[producer]33[0m is making baozi %s" %n )
     
     
    if __name__ == '__main__':
        con = consumer("c1")
        con2 = consumer("c2")
        = producer()
     
    方法二  
    greenlet实现方法:
    greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
    安装方法:
    pip install greenle
    如何使用请看下面例子!
     
    from greenlet import greenlet
     
    def test1():
        print(12)
        gr2.switch()#手工切换
        print(34)
        gr2.switch()#手工切换
     
     
    def test2():
        print(56)
        gr1.switch()
        print(78)
     
     
    gr1 = greenlet(test1)
    gr2 = greenlet(test2)
    gr1.switch()   #手工切换
     
     
    Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
     
     
    import gevent
     
    def func1():
        print('33[31;1m李闯在跟海涛搞...33[0m')
        gevent.sleep(2)
        print('33[31;1m李闯又回去跟继续跟海涛搞...33[0m')
     
    def func2():
        print('33[32;1m李闯切换到了跟海龙搞...33[0m')
        gevent.sleep(1)
        print('33[32;1m李闯搞完了海涛,回来继续跟海龙搞...33[0m')
     
     
    gevent.joinall([
        gevent.spawn(func1),
        gevent.spawn(func2),
        #gevent.spawn(func3),
    ])
     
     
     
     
  • 相关阅读:
    事务
    handler
    codeforces 27E Number With The Given Amount Of Divisors
    暑期实践日志(五)
    暑期实践日志(四)
    暑期实践日志(三)
    暑期实践日志(二)
    暑期实践日志(一)
    数论 UVALive 2756
    数论 UVALive 2911
  • 原文地址:https://www.cnblogs.com/fgxwan/p/9647611.html
Copyright © 2011-2022 走看看