python入门开发学习笔记之掌握gevent模块

python协程之gevent模块_python3 那么这个过程看起来和线程差不多。其实不然, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。 阅读详情

本节重点

掌握gevent模块
本节时长需控制在15分钟内

一 gevent模块

安装

pip3 install gevent

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

#用法
g1=gevent.spawn(func,1,,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的

g2=gevent.spawn(func2)

g1.join() #等待g1结束

g2.join() #等待g2结束

#或者上述两步合作一步:gevent.joinall([g1,g2])

g1.value#拿到func1的返回值

遇到IO阻塞时会自动切换任务

import gevent
def eat(name):
    print('%s eat 1' %name)
    gevent.sleep(2)
    print('%s eat 2' %name)

def play(name):
    print('%s play 1' %name)
    gevent.sleep(1)
    print('%s play 2' %name)


g1=gevent.spawn(eat,'egon')
g2=gevent.spawn(play,name='egon')
g1.join()
g2.join()
#或者gevent.joinall([g1,g2])
print('主')

上例gevent.sleep(2)模拟的是gevent可以识别的io阻塞,

而time.sleep(2)或其他的阻塞,gevent是不能直接识别的需要用下面一行代码,打补丁,就可以识别了

from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前

或者我们干脆记忆成:要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头

from gevent import monkey;monkey.patch_all()

import gevent
import time
def eat():
    print('eat food 1')
    time.sleep(2)
    print('eat food 2')

def play():
    print('play 1')
    time.sleep(1)
    print('play 2')

g1=gevent.spawn(eat)
g2=gevent.spawn(play_phone)
gevent.joinall([g1,g2])
print('主')

我们可以用threading.current_thread().getName()来查看每个g1和g2,查看的结果为DummyThread-n,即假线程

二 练习

通过gevent实现单线程下的socket并发(from gevent import monkey;monkey.patch_all()一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞)

服务端

from gevent import monkey;monkey.patch_all()
from socket import *
import gevent

#如果不想用money.patch_all()打补丁,可以用gevent自带的socket
# from gevent import socket
# s=socket.socket()

def server(server_ip,port):
    s=socket(AF_INET,SOCK_STREAM)
    s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    s.bind((server_ip,port))
    s.listen(5)
    while True:
        conn,addr=s.accept()
        gevent.spawn(talk,conn,addr)

def talk(conn,addr):
    try:
        while True:
            res=conn.recv(1024)
            print('client %s:%s msg: %s' %(addr[0],addr[1],res))
            conn.send(res.upper())
    except Exception as e:
        print(e)
    finally:
        conn.close()

if __name__ == '__main__':
    server('127.0.0.1',8080)

多线程并发多个客户端

from threading import Thread
from socket import *
import threading

def client(server_ip,port):
    c=socket(AF_INET,SOCK_STREAM) #套接字对象一定要加到函数内,即局部名称空间内,放在函数外则被所有线程共享,则大家公用一个套接字对象,那么客户端端口永远一样了
    c.connect((server_ip,port))

    count=0
    while True:
        c.send(('%s say hello %s' %(threading.current_thread().getName(),count)).encode('utf-8'))
        msg=c.recv(1024)
        print(msg.decode('utf-8'))
        count+=1
if __name__ == '__main__':
    for i in range(500):
        t=Thread(target=client,args=('127.0.0.1',8080))
        t.start()
python安装gevent Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。 最近在研究可是安装遇到各种各样蛋疼的问题 1.python版本是2.764位的,可是Gevent没有Windows下的64位的,就把源码包下载下来了,先执行     python fetch_libevent.py       python 阅读详情

相关推荐

协程[greenlet模块,Gevent模块]

必须在只有一个单线程里实现并发修改共享数据不需加锁用户程序里自己保存多个控制流的上下文栈对于实现协程来说,要实现保存状态加切换 并且需要在遇到 IO 时能够切换: 实例化一个协程对象spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的g1.join(): 等待g1结束g2.join(): 等待g2结束: 将上述两部合成一步g1.value: 拿到func1的返回值。......

Yietong的博客 599

Python 高性能并发框架 Gevent、后门程序

gevent 是一个基于协程的 Python 网络库,它使用 greenlet 在 libev 或 libuv 事件循环之上提供高级同步 API。gevent 实现了python 标准库里面大部分的阻塞式系统调用,包括 socket、ssl、threading 和 select 等模块,可以使用 "猴子补丁" 将这些阻塞式调用变为协作式运行。

freeking101的博客 6万+

lidar点云比赛-Southlidar软件使用入门

lidar点云比赛-Southlidar软件使用入门 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.09.29 一、软件资源及安装 1.下载地址: https://pan.baidu.com/s/1jN1pynmAZOqj5mMx774pVg 提取码:gkvv (资源来自南方测绘) 2.安装 进入链接,找到软件文件夹, 内含文件即为安装包 3.下载成功后按提示安装即可 4.安装成功后桌面自动创建一个快捷方式 二、界面布

qq_49621416的博客 4891

python gevent协程模块详解

进程、线程、协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点: 相同点存在于,当我们挂起一个执行流的时,我们要保存的东西: 栈, 其实在你切换前你的局部变量,以及要函数的调用都需要保存,否则都无法恢复 寄存器状态,这个其实用于当你的执行流恢复后要做什么 而寄存器和栈的

爱死亡机器人 1756

《爬虫和逆向教程》 - 专栏介绍和目录

本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。

数据知道的博客 2万+

003、高通骁龙Spectra ISP架构深度解析:IFE/BPS/IPE流水线与Chromatix调优实战

摘要: 本文深入解析高通骁龙Spectra ISP架构,重点剖析IFE、BPS、IPE三阶段的流水线协作机制与Chromatix调优实战。通过夜景预览"水波纹"案例,揭示HDR对齐与TNR运动估计的关联性问题,指出ISP调优需关注模块间的时序与带宽约束。文章详解各模块核心功能:IFE负责RAW域处理(HDR合成/校正),BPS专注降噪与细节增强,IPE进行YUV域精处理。针对Chromatix调优,强调参数与寄存器映射关系,并给出LSC网格密度、TNR运动灵敏度、LTM光晕等典型问题的解决方案。最后提出实用

zzfmlxs的博客 229

python gevent 协程 导入模块问题

import gevent import gevent.monkey gevent.monkey.patch_all() 这三行代码一定要写在文件的开头且不要分开哦!!不然会报错 附例子:协程网络下载 1 import gevent 2 import gevent.monkey 3 4 # 协程自动切换 5 gevent.monkey.patch_all() ...

wto882dim的博客 989

【OS】AUTOSAR架构下MCAL Modules软件分区问题分析

AUTOSAR架构下MCAL Modules软件分区问题分析

qq_36056498的博客 939

python3.7.1导入gevent模块报错的解决方案

而查看安装模块也没有任何问题,就是无法调用,在网上找了很多贴子,有各种说法,但是都看不明白,也没有解决。这条命令的大概意思就是使用非二进制的包重新安装gevent以及它的依赖。

weixin_47118681的博客 6597

【毕设级教程】从0到1实现基于YOLOv8的xView卫星图像目标检测系统(含UI界面,助力遥感智能毕设)

本文基于YOLOv8模型设计了一个面向xView卫星图像的目标检测系统。首先对xView数据集进行了格式转换处理,将原始多边形标注转换为YOLO格式的边界框标注。随后通过配置YOLOv8模型参数完成训练,实现了对卫星图像中建筑、车辆等多类目标的准确识别。为提高系统交互性,采用PyQt开发了可视化界面,支持图像选择、实时检测和结果展示功能。整个系统兼顾学术价值和实用价值,为遥感领域的自动化目标检测提供了可行方案。

m0_64661770的博客 130

android osmdroid 加载常用离线地图格式(开源的在线地图)

osmdroid是(几乎)完整/免费更换为Android MapView(v1 API)类。它还包括一个模块化的瓷砖供应商系统支持众多的在线和离线瓷砖来源和覆盖支持内置覆盖绘制图标,跟踪位置和形状。如果想在你项目中使用osmdroid,绝对是灵活度最高,不用申请百度,高德等的key。还有一堆规则要遵循。osmdroid可以支持多图层叠加,绘制自已的图层。离线加载常用地图格式zip,sqlite,.

mmsx990的博客 1万+

协程gevent(monkey)的使用(并发)方便快捷

import gevent import time from gevent import monkey # 这是一个补丁,代码中有耗时操作,换为gevent中自己实现的模块 monkey.patch_all() def f(n): for i in range(n): print('---%d---' % i) time.sleep(0.5) # gevent.joinall()实现多个协程同时工作,内部是一个列表。gevent.spawn()生成一个协程对...

weixin_40252835的博客 739

仿真模型简单介绍

同时,各种以伯克利的Spice仿真程序的算法为核心的商用Spice电路仿真工具也随之产生,运行在PC和UNIX平台,许多都是基于原始的SPICE2G6版的源代码,这是一个公开发表的版本,它们都在Spice的基础上做了很多实用化的工作,比较常见的Spice仿真软件有HSpice、Pspice、Spectre、Tspice、SmartSpcie、IsSpice等,虽然它们的核心算法雷同,但仿真速度、精度和收敛性却不一样,其中以Synopsys公司的Hspice和Cadence公司的Pspice最为著名。...

小幽余生不加糖 8002

Python协程(gevent模块)

一:前言 协程又称为微线程,纤程。英文名Coroutine:协程是一种用户态的轻量级线程 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复之前保存的寄存器上下文和栈。因此: 协程能够保留上次一调用时的状态,能够进入上一次离开时所处的逻辑流的位置  协程的好处 无需线程上下文切换的开销 无需原子操作(不会被线程调度机制打断的操作)...

马赛克的博客 1万+

【局部规划模块轨迹优化算法】EM_planner最大期望滚动优化算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对EM_planner最大期望滚动优化算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 760

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

协程gevent模块的使用

什么是协程?协又叫又称微线程,英文名Coroutine,协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适gr的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。通俗的描述:协程看做是是线程中的一个特殊的函数,这个函数执行的时候,可以在某个地方暂停,并且可以重新在暂停处,继续运行,协程在进行切换的时候,只需要保存当前协程函数中的一些临

henry_rhy的博客 2384

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python协程之gevent

Python协程之gevent1. gevent的介绍2. gevent的使用3. gevent切换执行4. 给程序打补丁5. 注意 1. gevent的介绍 greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。 gevent内部封装的greenlet,其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到

汪云辉的博客 3623

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python 异步模块asyncio、aiohttp、gevent

asyncio、aiohttp、gevent模块 文章目录asyncio、aiohttp、gevent模块概述基础示例核心解析创建 task绑定回调函数await 挂起耗时操作aiohttp 网络访问并发访问多进程配合关闭协程同类型 gevent 模块 概述 在Python3.6后,可以通过关键词async def来定义一个coroutine协程,协程就相当于未来需要完成的任务,多个协程就是多...

Zok的博客 1818

8、Python 协程:gevent 示例

Python 协程:gevent 示例

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1395

python gevent async_详解python之协程gevent模块

进程、线程、协程区分我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。进程和协程下面对比一下进程和协程的相同点和不同点:相同点:相同点存在于,当我们挂起一个执行流的时,我们要保存的东西:栈, 其实在你切换前你的局部变量,以及要函数的调用...

weixin_39834745的博客 466

Python Flask使用gevent或grpc.gevent模块实现异步非阻塞

Flask本身并不是一个异步框架,因此在处理高并发请求时会出现性能瓶颈。然而,Flask可以通过与其他异步框架和库的集成来提高并发性能。所以下面会介绍gevent、gprc两种协程库,如何结合使用到Flask项目中,提高项目本身的并发性能。文中我会写份简单的接口代码,通过ab(Apache bench)工具进行请求压测,观察两个模块对Flask项目性能提升的情况。gevent是一个基于协程的Python网络编程库,它可以使编写异步代码变得更加简单和高效。

q2565330017的博客 3094

python gevent async_python之协程gevent模块

进程、线程、协程区分我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。进程和协程下面对比一下进程和协程的相同点和不同点:相同点:相同点存在于,当我们挂起一个执行流的时,我们要保存的东西:栈, 其实在你切换前你的局部变量,以及要函数的调用...

weixin_39892842的博客 277

Python 协程 gevent 模块

Python 协程 gevent 模块 文章目录Python 协程 gevent 模块

贤哲XianZhe的博客 465

ubuntu python 安装 gevent 模块终极篇

Python 安装 gevent 模块 终极篇 今天在使用python的协程时候,给出一种gevent的安装方法 出现的问题 : sudo pip3 install gevent 出现连接超时,或者下载到一半就崩了。如下图 然后开始尝试别的方法 1.下载github源码-----用 python setup.py install--------我这边是失败了,报错gcc,没有解决。(大家可以尝...

GMCN的博客 2107

Python使用gevent实现协程

Python使用gevent实现协程 Python中多任务的实现可以使用进程和线程,也可以使用协程。 一、协程介绍 协程,又称微线程。英文名Coroutine。协程是Python语言中所特有的,在其他语言中没有。 协程是python中另外一种实现多任务的方式,比线程更小、占用更小执行单元(理解为需要的资源)。 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切...

weixin_43790276的博客 2787

python携程gevent_Python程序中的协程操作-gevent模块

一、安装安装:pip3 install gevent二、Gevent模块介绍Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet,它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。2.1 用法介绍g1=gevent.spawn(func,1,,2,3...

weixin_39924779的博客 314
上一篇: python入门开发学习笔记之掌握greenlet模块
下一篇: python入门开发学习笔记之了解IO模型
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值