Meinheld 是一个高性能的异步 WSGI Web 服务器。是一个兼容 WSGI 的服务器,支持 PEP333 和 PEP3333 规范。Meinheld 利用 greenlet 和 Picoev 实现异步 I/O。
Meinheld 要求 Python 2.x >= 2.6 或者 Python 3.x >= 3.2 ,同时要求 greenlet >= 0.4.5。支持 Linux, FreeBSD, Mac OS X. 也可以通过 Gunicorn 来提供服务。
示例代码:
from meinheld import server def hello_world(environ, start_response): status = '200 OK' res = "Hello world!" response_headers = [ ('Content-type','text/plain'), ('Content-Length',str(len(res)))] start_response(status, response_headers) return [res] server.listen(("0.0.0.0", 8000)) server.run(hello_world)
Running: uvicorn asgiproj.asgi:application -b 127.0.0.1:8001 [erm@fezzan ~]$ wrk -d20s -t10 -c200 http://127.0.0.1:8001/asgi/ Running 20s test @ http://127.0.0.1:8001/asgi/ 10 threads and 200 connec
configm.py: # -*-coding:utf-8 -*- __author__ = "ZJL" import multiprocessing # 监听本机的5000端口 bind = '0.0.0.0:5000' preload_app = True # 开启进程 # workers=4 workers = multiprocessing.cpu_count() * 2 + 1
XYM个人博客对应篇章 meinheld + gunicorn + flask 是神器啊,小小研究了一下。 【Coroutine】 Coroutine:协程,又称微线程,纤程。 协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。 python中的yield和
XYM个人博客对应篇章 meinheld + gunicorn + flask 是神器啊,小小研究了一下。 【Coroutine】 Coroutine:协程,又称微线程,纤程。 协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。 python中的yield和第三
config.py(gunicorn+gevent): # -*-coding:utf-8 -*- __author__ = "ZJL" import gevent.monkey import multiprocessing gevent.monkey.patch_all() # 监听本机的5000端口 bind = '0.0.0.0:5000' preload_app = True
测试环境: 客户端虚拟机配置:cpu:1c2t ; os :centos 7 ;Mem:4GB 服务器虚拟机配置:cpu:2c4t ; os :centos 7 ;Mem:4GB 测试结果: 服务端gunicorn启动命令: gunicorn -w 2 -b 0.0.0.0:8080 run:app --error-logfile - --worker-class egg:meinhe
异步Tcp客户端 异步Http客户端 异步Redis客户端 异步Mysql客户端 异步Log日志 异步文件读写 异常Exception
异步Log日志 use AsyncLog; yield AsyncLog::info('hello world'); yield AsyncLog::debug('test debug', ['foo' => 'bar']); yield AsyncLog::notice('hello world',[], 'group.com'); yield Async
异常Exception 以传统的try,catch抓取异常 如果在业务层不catch,框架层会捕捉,并返回一个500的server error响应。 如果在开发环境会返回一个500的具体错误的trace响应。 try { throw new \Exception("Error Processing Request", 1); //yield throwExc
异步文件读写 读文件 use AsyncFile; $content = (yield AsyncFile::read(__ROOT__."runtime/test.txt")); 写文件 $res = (yield AsyncFile::write(__ROOT__."runtime/test.txt", "hello wordls!")); $res = (yi
异步Mysql客户端 AsyncMysql::query($sql, $usePool = true) 第二个参数设为false将不会使用连接池中的资源,默认都会从连接池中取,配置连接池数量 => config/database.php 具体使用 use AsyncMysql; //设置超时时间 AsyncMysql::setTimeout(2); $res = (
异步Redis客户端 连接池(连接池默认开启) use AsyncRedis; //关闭连接池 AsyncRedis::enablePool(false); //开启连接池 AsyncRedis::enablePool(true); 使用AsyncRedis use AsyncRedis; //设置超时时间 AsyncRedis::s
异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);
异步Tcp客户端 串行发包 use AsyncTcp; $tcp = new AsyncTcp('127.0.0.1', 9501); $tcp->setTimeout(2); //串行发送 $res = (yield $tcp->call('hello server!')); $res = (yield $tcp->call('hello serv