zoukankan      html  css  js  c++  java
  • python 协程

    通过 yield 方式实现

    # -*- coding: utf-8 -*-
    
    '''
    协程,又称为线程,是一种用户装态的轻量级线程。
    协程拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存在其他地方,
    在切回来的时候恢复到先前保存的寄存器上下文和栈
    
    
    协程的好处:
        1.无需线程上下文切换的开销
        2.方便切换控制流,简化编程模型
        3.无需院子操作锁定及同步的开销
        4.高并发,高扩展,低成本
        
    缺点:
        1.无法利用多核资源
        2.阻塞操作会阻塞整个程序
        
    '''
    
    
    import time
    import queue
    
    
    def consumer(name):
        print("------->start eating baozi")
        while True:
            #函数中有yield的时候这个函数会变成一个生成器,当调用__next()__方法的时候会继续运行
            new_baozi = yield
            print("[%s] is eating baozi %s"%(name,new_baozi))
    
    
    
    def producer():
        r = con.__next__()
        r = con2.__next__()
        n=0
        while n<5:
            n+=1
            con.send(n)
            con2.send(n)
            print('%s making baozi '%n)
    
    if __name__=='__main__':
        con = consumer('c1')
        con2 = consumer('c2')
        p = producer()

    greenlet 实现手动切换协程

    # -*- coding: utf-8 -*-
    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  实现自动切换

    import gevent
    
    
    def foo():
        print('runing in foo')
        gevent.sleep(2)
        print('再次切回到foo')
    
    
    def bar():
        print("切换到bar")
        gevent.sleep(1)
        print('切换回bar')
    
    
    gevent.joinall([
        gevent.spawn(foo),
        gevent.spawn(bar),
    ])
  • 相关阅读:
    Mysql权限控制
    ionic中修改图标的问题
    在centos中使用vim编辑器
    使用laravel的任务调度(定时执行任务)
    在预装win8的电脑上换win7系统讲解
    游戏电脑需要看的配置
    数据结构学习之二叉树
    数据结构排序算法之希尔排序
    数据结构排序算法之归并排序
    数据结构排序算法之简单插入排序
  • 原文地址:https://www.cnblogs.com/gaizhongfeng/p/8047626.html
Copyright © 2011-2022 走看看