zoukankan      html  css  js  c++  java
  • 协程

    协程的目的是在单线程下实现并发

    为什么出现协程? 因为cpython 由于GIL 

    导致同一时间只有一个线程再跑

    意味着 如果你的程序时计算密集 多线程效率也不会提升
    如果是io密集型 有没有必要再单线程下实现并发
    没有 我会开启多线程来处理io 子线遇到io cpu切走 但是请问 你能保证一定切到主线吗? 不能保证
    有 如果可以 我在遇到io的时候转而去做计算 这样一来可以保证cpu一直在处理你的程序 当然时间太长也要切走

    总结一下:单线下实现并发 将io阻塞时间用于执行计算 可以提高效率 原理:一直使用CPU直到超时

    怎么实现单线程并发?

    并发 指的是 看起来像是同时运行 实际是在任务间来回切换 同时需要保存执行的状态
    任务一堆代码 可以用函数装起来

      1.如何让两个函数切换执行
      yield可以保存函数的执行状态
      通过生成器可以实现伪并发
      并发不一定提升效率 反而会降低效率 当任务全是计算时
    2.如何知道发生了io? 从而切换执行
      目前咱们实现不了
      第三方模块 greenlet 可以实现并发 但是不能检测io
      第三方模块 gevent 封装greenlet 可以实现单线程并发 并且能够检测io操作 自动切换

    greenlet

    import greenlet
    
    import time
    def task1():
        print("task1 1")
        time.sleep(2)
        g2.switch()
        print("task1 2")
        g2.switch()
    
    def task2():
        print("task2 1")
        g1.switch()
        print("task2 2")
    
    g1 = greenlet.greenlet(task1)
    g2 = greenlet.greenlet(task2)
    
    g1.switch()
    
    # 1.实例化greenlet得到一个对象 传入要执行的任务
    #   至少需要两个任务
    # 2.先让某个任务执行起来 使用对象调用switch
    # 3.在任务的执行过程中 手动调用switch来切换
    #

    gevent

    from gevent import monkey
    monkey.patch_all()
    
    import gevent
    import time
    def eat():
        print('eat food 1')
        time.sleep(2)
        # gevent.sleep(1)
        print('eat food 2')
    
    def play():
        print('play 1')
        time.sleep(1)
        # gevent.sleep(1)
        print('play 2')
    
    g1=gevent.spawn(eat)
    g2=gevent.spawn(play)
    # g1.join()
    # g2.join()
    
    gevent.joinall([g1,g2])
    print('')
    
    # 1.spawn函数传入你的任务
    # 2.调用join 去开启任务
    # 3.检测io操作需要打monkey补丁  就是一个函数 在程序最开始的地方调用它
  • 相关阅读:
    python学习笔记(一)--之list与tuple
    centos 安装redis3.0为解决数据库频繁插入数据IO性能问题
    Win32汇编木马初探
    Knockout自定义绑定my97datepicker
    iTextSharp给PDF添加水印
    技术资料整理
    css模拟阴影和小三角
    统计一个部门有多少人
    js登录界面带提示
    程序员给女朋友用HTML5制作的3D相册 (www.webhek.com)<转摘>
  • 原文地址:https://www.cnblogs.com/msj513/p/9953260.html
Copyright © 2011-2022 走看看