gevent:轻松异步 I/O
admin
2023-07-31 00:38:12
0

介绍

gevent是一个使用完全同步编程模型的可扩展的异步I/O框架。

让我们先来看一些示例,这里有一个 echo 服务器:

123456789 from gevent.server import StreamServer def connection_handler(socket, address):    for l in socket.makefile(\’r\’):        socket.sendall(l) if __name__ == \’__main__\’:    server = StreamServer((\’0.0.0.0\’, 8000), connection_handler)    server.serve_forever()

 

在这个例子中,我们并行发出100个web请求:

12345678910111213 from gevent import monkeymonkey.patch_all() import urllib2from gevent.pool import Pool def download(url):    return urllib2.urlopen(url).read() if __name__ == \’__main__\’:    urls = [\’http://httpbin.org/get\’] * 100    pool = Pool(20)    print pool.map(download, urls)

 

有些奇怪monkey.patch_all()的调用?不用担心,这可不像你每天打的猴子补丁(译注:monkey patching,即动态修改执行代码)。这仅仅是Python发行版恰好要打的一组猴子补丁。

最后一个例子是一个聊天服务器:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 import geventfrom gevent.queue import Queuefrom gevent.server import StreamServer users = {}  # mapping of username -> Queue def broadcast(msg):    msg += \’\\n\’    for v in users.values():        v.put(msg) def reader(username, f):    for l in f:        msg = \’%s> %s\’ % (username, l.strip())        broadcast(msg) def writer(q, sock):    while True:        msg = q.get()        sock.sendall(msg) def read_name(f, sock):    while True:        sock.sendall(\’Please enter your name: \’)        name = f.readline().strip()        if name:            if name in users:                sock.sendall(\’That username is already taken.\\n\’)            else:                return name def handle(sock, client_addr):    f = sock.makefile()     name = read_name(f, sock)     broadcast(\’## %s joined from %s.\’ % (name, client_addr[0])) from %s.\’ % (name, client_addr[0]))有一个 echo 服务器:

123456789 from gevent.server import StreamServer def connection_handler(socket, address):    for l in socket.makefile(\’r\’):        socket.sendall(l) if __name__ == \’__main__\’:    server = StreamServer((\’0.0.0.0\’, 8000), connection_handler)    server.serve_forever()

 

在这个例子中,我们并行发出100个web请求:

12345678910111213 from gevent import monkeymonkey.patch_all() import urllib2from gevent.pool import Pool def download(url):    return urllib2.urlopen(url).read() if __name__ == \’__main__\’:    urls = [\’http://httpbin.org/get\’] * 100    pool = Pool(20)    print pool.map(download, urls)

 

有些奇怪monkey.patch_all()的调用?不用担心,这可不像你每天打的猴子补丁(译注:monkey patching,即动态修改执行代码)。这仅仅是Python发行版恰好要打的一组猴子补丁。

最后一个例子是一个聊天服务器:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 import geventfrom gevent.queue import Queuefrom gevent.server import StreamServer users = {}  # mapping of username -> Queue def broadcast(msg):    msg += \’\\n\’    for v in users.values():        v.put(msg) def reader(username, f):    for l in f:        msg = \’%s> %s\’ % (username, l.strip())        broadcast(msg) def writer(q, sock):    while True:        msg = q.get()        sock.sendall(msg) def read_name(f, sock):    while True:        sock.sendall(\’Please enter your name: \’)        name = f.readline().strip()        if name:            if name in users:                sock.sendall(\’That username is already taken.\\n\’)            else:                return name def handle(sock, client_addr):    f = sock.makefile()     name = read_name(f, sock)     broadcast(\’## %s joined from %s.\’ % (name, client_addr[0]))lass=\”crayon-sy\”>() import urllib2from gevent.pool import Pool def download(url):    return urllib2.urlopen(url).read() 

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python查找阿姆斯特朗数 题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...