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

    '''
    协程
    无切换消耗
    实现了并发,并发:并非线程切,而是线程执行的任务的切换,如果直接切换任务,也是并发
    缺点:不能利用多核
    协程是重点,实现多并发,封装了很多好模块,后期应用
    '''

    协程基本实现
    import time
    
    def consumer():
        r = ''
        while True:
            n = yield r
            print('[CONSUMER]<<Consuming %s...' %n)
            time.sleep(1)
            r = '200 OK'
    
    def produce(c):
        next(c)
        n = 0
        while n < 5:
            n = n + 1
            print('[PRODUCER]>>Producing %s...' %n)
            cr = c.send(n)
            print('[PRODUCER]>>Consumer return: %s' % cr)
    
    if __name__ == '__main__':
        c = consumer()
        produce(c)
    '''
    greenlet
    不常用,只能切任务,但是对IO密集型任务不能节省时间
    '''
    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遇到IO操作时,比如访问网络,就自动切换到其他的gevent,等到IO操作完成,再在适当的时候切换回来继续执行
    '''
    import requests,gevent,time
    from gevent import monkey
    monkey.patch_all()
    # 由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成
    
    def foo(url):
        response=requests.get(url)
        response_str=response.text
        print("GET data %s"%len(response_str),url)
    
    s=time.time()
    
    gevent.joinall([gevent.spawn(foo,"https://itk.org/"),
                    gevent.spawn(foo,"https://www.github.com/")])
                    # gevent.spawn(foo, "https://zhihu.com/")])
    
    print(time.time()-s)
  • 相关阅读:
    ExtJS学习之路第一步:对比jQuery,认识ExtJS
    创建Windows服务(C++)
    吴恩达2014机器学习教程笔记目录
    在Hexo中渲染MathJax数学公式
    Linux服务器性能检测命令集锦
    Redis开启AOF导致的删库事件
    从表扩展增加列属性说起
    数据库规约解读
    MySQL规约(阿里巴巴)
    HDFS运行原理
  • 原文地址:https://www.cnblogs.com/lucaq/p/7225231.html
Copyright © 2011-2022 走看看