zoukankan      html  css  js  c++  java
  • 单线程实现并发——协程,gevent模块

    一 并发的本质  

      1 切换

      2 保存状态

    二 协程的概念

      协程,又称微线程,纤程。英文名Coroutine。单线程下实现并发,用户从应用程序级别控制单线程下任务的切换,注意一定是遇到I/O才切。

      协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

      最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

      第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

      因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

    三 gevent模块

      gevent是一个基于协程的Python网络库。

      需要导入猴子补丁。

      方法:

        g1=gevent.spawn(func,):提交任务。   生成g1,是Greenlet类

        gevent.sleep():睡

        gevent.joinall(可迭代对象):阻塞,知道所有选中的任务执行完毕。

        g1.join() 

        g1.value 获取由func函数生成Greenlet类的返回值。

    复制代码
    import gevent
    from gevent import monkey;monkey.patch_all()
    from threading import current_thread
    import time
    def foo():
        print('%s is running ' % current_thread().getName())
        time.sleep(1)
        print('%s is done '%current_thread().getName())
    def bar():
        print('%s is running ' % current_thread().getName())
        time.sleep(2)
        print('%s is done ' % current_thread().getName())
    
    g1=gevent.spawn(foo)      
    g2=gevent.spawn(bar)
    print('g1',g1)
    print('g2',g2)
    
    # g1.join()
    # g2.join()
    gevent.joinall([g1,g2])
    复制代码

      输出:

    g2 <Greenlet at 0x26d7aff0898: bar>
    DummyThread-1 is running 
    DummyThread-2 is running 
    DummyThread-1 is done 
    DummyThread-2 is done 
  • 相关阅读:
    在DOS的常用命令
    HTML中USEMAP的用法
    asp.net2.0角色管理,详细步骤
    利用ASP.NET动态生成HTML文件
    PetShop 4.0 详解之五(PetShop之业务逻辑层设计)
    使用成员资格和用户登录创建网站 (Visual Studio)
    Windows 找不到文件'(null)'.请确定文件名是否正确后,再试一下.要搜索文件,请单击[开始]按钮,然后单击"搜索"
    在ashx文件中读写session
    asp.net图片滚动+JAVASCRIPT(向右)
    动态编辑程序配置文件
  • 原文地址:https://www.cnblogs.com/ExMan/p/10138850.html
Copyright © 2011-2022 走看看