首页 > 其他 > 详细

并发编程~~~协程~~~greenlet模块, gevent模块

时间:2019-11-05 23:13:51      阅读:95      评论:0      收藏:0      [点我收藏+]

一 协程

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])

并发编程~~~协程~~~greenlet模块, gevent模块

原文:https://www.cnblogs.com/lav3nder/p/11802366.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!