zoukankan      html  css  js  c++  java
  • 协程

    什么是协程?

      进程 :资源单位

      线程 :执行单位 

      协程 :单线程下实现并发

      复习 什么是并发 

        多道技术(时间上的复用) 切换 + 保存状态

        看起来像同时执行 就可以称之为并发

      协程: 完全是程序员自己意淫出来的名词  单线程下实现并发

      程序员自己通过代码自己检测程序中的IO
        一旦遇到IO自己通过代码切换
      给操作系统的感觉是你这个线程没有任何的IO
      ps:欺骗操作系统 让它误认为你这个程序一直没有IO
        从而保证程序在运行态和就绪态来回切换
          提升代码的运行效率

    切换+保存状态就一定能够提升效率吗???
    当你的任务是iO密集型的情况下 提升效率
    如果你的任务是计算密集型的 降低效率
    #基于yield并发执行  1.3952205181121826
    import time
    def func1():
        while True:
            10000000+1
            yield
    
    def func2():
        g=func1()
        for i in range(10000000):
            time.sleep(100)  # 模拟IO,yield并不会捕捉到并自动切换
            i+1
            next(g)
    
    start=time.time()
    func2()
    stop=time.time()
    print(stop-start)
    需要找到一个能够识别IO的一个工具  gevent 模块
    from gevent import monkey;monkey.patch_all()  # 由于该模块经常被使用 所以建议写成一行
    from gevent import spawn
    import time
    """
    注意gevent模块没办法自动识别time.sleep等io情况
    需要你手动再配置一个参数  他就是我们的小猴老师 monkey
    """
    
    def heng():
        print("")
        time.sleep(2)
        print('')
    
    def ha():
        print('')
        time.sleep(3)
        print('')
    
    def heiheihei():
        print('嘿嘿嘿')
        time.sleep(5)
        print('嘿嘿嘿')
    
    start = time.time()
    g1 = spawn(heng) 他会有一个返回值 可是使用join方法 不然 spawn()里的函数就直接执行 但是spawn也不等他执行完就 结束了
    g2 = spawn(ha)  # spawn会检测所有的任务
    g3 = spawn(heiheihei)
    g1.join()
    g2.join()
    g3.join()
    
    print(time.time() - start)
    趁自己还没死 多折腾折腾
  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/lddragon/p/11359222.html
Copyright © 2011-2022 走看看