gevent初步

2023-10-31 00:38
文章标签 初步 gevent

本文主要是介绍gevent初步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

话说gevent也没个logo啥的,于是就摆了这张图= =|||,首先这是一种叫做greenlet的鸟,而在python里,按照官方解释greenlet是轻量级的并行编程,而gevent呢,就是利用 greenlet实现的基于协程的python的网络library,好了,关系理清了。。。

话 说pycon没有白去阿,了解了很多以前不知道的东西,比如说协程,gevent,greenlet,eventlet。说说协程,进程和线程大家平时了 解的都比较多,而协程算是一种轻量级进程,但又不能叫进程,因为操作系统并不知道它的存在。什么意思呢,就是说,协程像是一种在程序级别来模拟系统级别的 进程,由于是单进程,并且少了上下文切换,于是相对来说系统消耗很少,而且网上的各种测试也表明,协程确实拥有惊人的速度。并且在实现过程中,协程可以用 以前同步思路的写法,而运行起来确是异步的,也确实很有意思。话说有一种说法就是说进化历程是多进程->多线程->异步->协程,暂且 不论说的对不对,单从诸多赞誉来看,协程还是有必要理解一下的。

比较惭愧,greenlet没怎么看就直接看gevent,官方文档 还是可以看看的,尤其是源码里的examples都相当不错,有助于理解gevent的使用。

gevent封装了很多很方便的接口,其中一个就是monkey

  1. from gevent import monkey
  2. monkey. patch_all ( )

这样两行,就可以使用python以前的socket之类的,因为gevent已经给你自动转化了,真是超级方便阿。

而且安装gevent也是很方便,首先安装依赖libevent和greenlet,再利用pypi安装即可

  1. sudo apt-get install libevent-dev
  2. sudo apt-get install python-dev
  3. sudo easy-install gevent

然后,gevent中的event,有wait,set等api,方便你可以让某些协程在某些地方等待条件,然后用另一个去唤醒他们。

再就是gevent实现了wsgi可以很方便的当作python的web server服务器使。

最后放送一个我利用gevent实现的一个带有缓存的dns server

 

     # -*- coding: UTF-8 -*-import geventimport dnslibfrom gevent import socketfrom gevent import eventrev=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)rev.bind(('',53))ip=[]cur=0def preload():for i in open('ip'):ip.append(i)print "load "+str(len(ip))+" ip"def send_request(data):global curret=rev.sendto(data,(ip[cur],53))cur=(cur+1)%len(ip)class Cache:def __init__(self):self.c={}def get(self,key):return self.c.get(key,None)def set(self,key,value):self.c[key]=valuedef remove(self,key):self.c.pop(key,None)cache=Cache()def handle_request(s,data,addr):req=dnslib.DNSRecord.parse(data)qname=str(req.q.qname)qid=req.header.idret=cache.get(qname)if ret:ret=dnslib.DNSRecord.parse(ret)ret.header.id=qid;s.sendto(ret.pack(),addr)else:e=event.Event()cache.set(qname+"e",e)send_request(data)e.wait(60)tmp=cache.get(qname)if tmp:tmp=dnslib.DNSRecord.parse(tmp)tmp.header.id=qid;s.sendto(tmp.pack(),addr)def handle_response(data):req=dnslib.DNSRecord.parse(data)qname=str(req.q.qname)print qnamecache.set(qname,data)e=cache.get(qname+"e")cache.remove(qname+"e")if e:e.set()e.clear()def handler(s,data,addr):req=dnslib.DNSRecord.parse(data)if req.header.qr:handle_response(data)else:handle_request(s,data,addr)def main():preload()while True:data,addr=rev.recvfrom(8192)gevent.spawn(handler,rev,data,addr)if __name__ == '__main__':main()

 

参考:http://www.isnowfy.com/introduction-to-gevent/

这篇关于gevent初步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311608

相关文章

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

Weka的初步介绍

Weka无疑是数据挖掘入门的最好工具,初学者可以直接使用图形界面了解数据挖掘的相关算法(如何使用网上有很多教程,可以参考 http://download.csdn.net/detail/u013422712/8649239)。     进阶阶段就必须学会使用和了解Weka的源码,这会在接下去的文章中写道。

Maven的初步使用以及命令行工具

在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围) compile 是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。 provided(已提供范围)provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web 应用,你可能在编译cl

基于LangChain+LLM的相关技术研究及初步实践

01 概述 大模型概述 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和推荐系统等。大模型通过训练海量数据来学习复杂的模式和特征,具有更强大的泛化能力,可以对未见过的数据

Mybaites初步认知

Mybaties中映射语句是最强大的地方。ResultMap是其中最重要,最强大的元素。 一个Mybaties以一个SqlSessionFactory实例为中心,通过配置类SqlSessionFactoryBuilder创建SqlSessionFactory. SqlSessionFactory作用域为application,在整个应用程序中始终存在,获取sqlsession实例。(SqlSe

2024数学建模国赛选题建议及初步思路来啦!

大家好呀,全国大学生数学建模竞赛今天下午开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。 精力有限,以下只是简略的图文版初步思路,更详细的视频版完整讲解请移步: 2024数学建模国赛选题建议及A、B、C题思路_哔哩哔哩_bilibili 首先是主基调: 本次国赛推荐大家选择B或C题目。A题目只建议数理基础很扎

2024高教社杯数学建模国赛ABCDE题选题建议+初步分析

提示:DS C君认为的难度:C<B<A,开放度:A<C<B 。 D、E题推荐选E题,后续会直接更新E论文和思路,不在这里进行选题分析,以下为A、B、C题选题建议及初步分析 A题:“板凳龙” 闹元宵 A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟一支舞龙队伍在螺旋路径中的行进,并求解队伍的整体动态行为。包括队伍的每秒位置、速度、碰撞检测、路径优化等

面向对象的简单初步认识

首先我们从一道经典的面向对象题目理解:一头母牛一年生一头小牛,一头小牛过四年也每年生一头小牛,照此推算,20年后一共有多少头牛? 牛:为一个具体对象。 牛:属性:年龄 按照题意可知:这头牛的年龄只要达到4岁就能开始生小牛 那首先我们先写一个小牛类:没过一年生一头小牛,这里面应该有个方法记录小牛的年龄,和新增的小牛 ​public void cow(){private int age;

scala界面GUI编程实战初步了解

示例代码: import scala.swing._//SimpleSwingApplication继承自SwingApplication类(此类中有main方法,因此可以运行显示界面)object Hello_GUI extends SimpleSwingApplication {def top = new MainFrame{ //顶级容器title = "Hello GUI"co