python异步--gevent深入学习

gevent是一个基于libev的并发库,通过greenlet实现轻量级协程,提供整洁的API处理并发和网络任务。异步执行能有效提升高并发程序效率,避免多线程/多进程的切换开销。gevent通过猴子补丁技术改造标准库,使其支持协作式调度,简化了异步编程。文章详细介绍了greenlet、同步与异步执行、超时处理等方面,展示了gevent在并发控制和资源管理方面的强大功能。
摘要由CSDN通过智能技术生成

gevent是基于libev的并发库,它为各种并发和网络相关的任务提供了整洁的API

异步可以说是解决高并发程序的最高效的方法,多线程/多进程的切换开销巨大,特别是在很多线程进程的情况下

greenlet

在gevent总用到的主要模式是greenlet,是一种轻量级协程,通过C扩展模块接入python,greenlets(注意加了s代表很多)

全部运行在主程序所在的进程中,被协作式的调度

因为终究是单线程的,所以任何时刻只有一个协程在运行

而multiprocess和threading可以真正的实现并行

同步和异步执行

并发是操作系统的基本特征之一,这与共享性互为依存的。并发的核心思想是把大的任务分解成一系列小的子任务,子任务可以是同时(并行)执行或者异步执行而不是一次一个的同步执行。两个子任务之间进行上下文切换

在gevent中,上下文切换(也就是代码执行到别的行,不是函数跳转)是通过yielding来完成的,

gevent会自动识别有阻塞的地方,会对用户透明的进行上下文切换,切换到别的行执行,注意gevent.joinall(里面两个事件会有隐式的轮询,通过开启另一个协程),即使时sleep了0秒,它也认为这里有阻塞代码,于是进行切换

import gevent


def foo():
    print('Running in foo')
    gevent.sleep(0)
    print('Explicit context switch to foo again')

 
def bar():
    print('Explicit context to bar')
    gevent.sleep(0)
    print('Implicit context switch back to bar')


gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])

当然我们也可以在很多可能发生阻塞操作的地方加上:yield from

import time
import gevent
from gevent import select

 
start = time.time()
tic = lambda: 'at %1.1f seconds' % (time.time() - start)

 
def gr1():
    # Busy waits for a second, but we don't want to stick around...
    print('Started Polling: %s' % tic())
    select.select([], [], [], 2)
    print('Ended Polling: %s' % tic())
 

def gr2():
    # Busy waits for a second, but we don't want to stick around...
    print('Started Polling: %s' % tic())
    select.select([], [], [], 2)
    print('Ended Polling: %s' % tic())
 

def gr3():
    print("Hey lets do some s
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值