zoukankan      html  css  js  c++  java
  • 并发编程~~~协程~~~greenlet模块, gevent模块

    一 协程

    1. 协程:

    单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.
    

    并发真正的核心: 切换并且保持状态.

    开启协程并发的执行,自己的程序把控着CPU在多个任务之间来回切换 + 保持状态.

    对比操作系统控制线程的切换,用户在单线程内控制协程的切换优缺点:

    2. 优点:

    1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
    2. 单线程内就可以实现并发的效果,最大限度的利用cpu
    

    3. 缺点:

    协程的本质是单线程,无法利用多核.
    

    4. 协程的特点:

    1. 必须在只有一个单线程里实现并发
    2. 修改共享数据不需要加锁
    3. 用户程序里自己保存多个控制流的上下文栈

    二 greenlet模块

    真正的协程模块就是使用greenlet完成的切换

    from greenlet import greenlet
    import time
    def eat(name):
        print(f'{name} eat 1')
        g2.switch('太白')
        time.sleep(3)
        print(f'{name} eat 2')
        g2.switch()
    
    def play(name):
        print(f'{name} play 1')
        g1.switch()
        print(f'{name} play 2')
    
    g1 = greenlet(eat)
    g2 = greenlet(play)
    
    g1.switch('太白')
    

    三 gevent模块

    from gevent import monkey;monkey.patch_all() 
    # 打补丁 必须放在被打补丁者的前面,后面所有的阻塞全都能识别到
    import gevent
    import time
    def eat(name):
        print(f'{name} eat 1')
        time.sleep(2)
        print(f'{name} eat 2')
    
    def play(name):
        print(f'{name} play 1')
        time.sleep(1)
        print(f'{name} play 2')
    
    g1 = gevent.spawn(eat,'太白')
    g2 = gevent.spawn(play,'太白')
    gevent.joinall([g1,g2])
    
  • 相关阅读:
    文件操作:根据现有类生成所需要的类
    Microsoft JScript 运行时错误: “”未定义
    未完成
    WPF模拟雷达界面效果图
    WebClient模拟网页提交表单
    201319
    Delphi中的InStrRev函数(倒找文本)
    利用IDhttp实现图片下载
    白话解释哈希表
    整理的Delphi常用字符串函数
  • 原文地址:https://www.cnblogs.com/lav3nder/p/11802366.html
Copyright © 2011-2022 走看看