zoukankan      html  css  js  c++  java
  • python语法基础-并发编程-协程-长期维护

     ###############    协程介绍    ##############

    """
    协程介绍
    
    # 协程和进程和线程一样都是实现并发的手段,
    
    # 协程
    # 协程本质上是一个线程,
    # 什么是协程:能够在多个任务之间切换来节省一些IO时间,
    # 不需要再浪费线程之间的切换了,只需要做程序之间的切换,
    # 程序任务之间的切换也是需要消耗时间,但是开销远远小于进程线程之间的切换,
    
    进程是操作系统调度的,
    线程是cpu调度的最小的单位
    协程本质就是一个线程,就是在线程上面来回切换而已,
    
    进程和线程之间的切换是由操作系统完成,
    协程任务之间的切换是由代码完成的,
    
    对比操作系统控制线程的切换,用户在单线程内控制协程的切换
    优点如下:
    #1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
    #2. 单线程内就可以实现并发的效果,最大限度地利用cpu
    缺点如下:
    #1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
    #2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
    
    # 协程:
    # c和c++,没有协程的概念,但是python有,
    # 这个协程,比线程,进程更加的简单,使用的时候是非常简单的,但是想要明白协程的这个过程,是比较复杂的,
    # 使用gevent来实现协程,想要明白gevent就要明白greenlet,想要明白greenlet就要明白yield,
    想要明白yield就要明白生成器,想要明白生成器,就要明白迭代器,
    
    """

     ###############    协程介绍    ##############

    # from greenlet import greenlet
    # # 这个模块可以实现协程的多个任务的切换,
    # # 这个greenlet就是真正的协程模块,
    #
    # def eat():
    #     print("eat start")
    #     g2.switch()
    #     print("eat end")
    #
    #
    # def play():
    #     print("play start")
    #     g1.switch()
    #     print("play end")
    #
    #
    # g1 = greenlet(eat)  # 注册,
    # g2 = greenlet(play)
    # g1.switch()  # 切换
    # g2.switch()
    
    """
    eat start
    play start
    eat end
    play end
    这就是实现了协程之间的切换
    
    """
    
    # 我们在工作中会使用进程,线程,协程来提高代码的并发效果,
    # 最多可以启动500个协程
    # 假设是4核cpu,
    # 可以开5个进程,20个线程,500个协程,就是5万个,就是允许5万个并发

     ###############    协程介绍    ##############

    from gevent import monkey;
    
    monkey.patch_all()  # 引入了这个就可以识别time.sleep了,这个必须写到最上面,
    import gevent
    import time
    
    
    def eat():
        print("eat start")
        time.sleep(1)
        print("eat end")
    
    
    def play():
        print("play start")
        time.sleep(1)
        print("play end")
    
    
    g1 = gevent.spawn(eat)  # 开启
    g2 = gevent.spawn(play)
    
    g1.join()
    g2.join()
    
    """
    你使用的时候,只需要把你的函数代码注册一下,然后就不需要管了,
    遇到IO了之后,会自动切换到另外一个任务去执行,然后再次回来,
    这样利用IO的时间,进入了IO(time.sleep(1))了之后不会停下来,会切换到其他的任务,然后第一个任务IO之后就切换回来,继续执行,
    协程的切换就是gevent来实现的,
    
    """

     ###############    协程介绍    ##############

  • 相关阅读:
    Linux 下安装 mysql8
    Git 上传本地项目到Github
    vue+vscode+nodejs 开发环境搭建
    window下 局域网内使用mysql,mysql 开启远程访问权限
    spring boot application 配置详情
    spring boot starter列表
    【第一篇】spring boot 快速入门
    Spring中手动增加配置文件中占位符引用的变量
    spring容器
    springmvc细节篇
  • 原文地址:https://www.cnblogs.com/andy0816/p/12289719.html
Copyright © 2011-2022 走看看