早上好友baojing.jiao发来消息跟我讨论eventlet。早就知道有这么个玩意,一直没空看。正好今天试试。发现其给出的聊天服务器的例子还算简单,就自己改改做出个http服务器的例子。一测性能才发现如此夸张。
先看程序:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# File: eventlet_httpd.py
# Date: 2009-08-07
# Author: gashero
"""
一个使用eventlet作为底层的http服务器,测试一下性能
"""
from eventlet import api
def httpd(writer,reader):
req=''
while True:
chunk=reader.readline()
if not chunk:
break
req+=chunk
if chunk=='\r\n':
break
data='Hello world!\r\n'
writer.write('HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s'%(len(data),data))
writer.close()
reader.close()
return
def main():
try:
server=api.tcp_listener(('0.0.0.0',3000))
print 'Server started!'
while True:
conn,addr=server.accept()
#print 'client %s connected!'%repr(addr)
writer=conn.makefile('w')
api.spawn(httpd,writer,conn.makefile('r'))
except KeyboardInterrupt:
pass
return
if __name__=='__main__':
main()
简单的说就是识别http请求报文结束,然后发送响应报文而已。
100并发时的apache ab性能测试结果:
Concurrency Level: 100
Time taken for tests: 17.710 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 5300000 bytes
HTML transferred: 1400000 bytes
Requests per second: 5646.57 [#/sec] (mean)
Time per request: 17.710 [ms] (mean)
Time per request: 0.177 [ms] (mean, across all concurrent requests)
Transfer rate: 292.25 [Kbytes/sec] received
1000并发时的apache ab性能测试结果:
Concurrency Level: 1000
Time taken for tests: 16.422 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 5300000 bytes
HTML transferred: 1400000 bytes
Requests per second: 6089.30 [#/sec] (mean)
Time per request: 164.223 [ms] (mean)
Time per request: 0.164 [ms] (mean, across all concurrent requests)
Transfer rate: 315.17 [Kbytes/sec] received
如上测试环境是分别在1G局域网内两台机器之间的测试,可不是同一台机器内部的测试
。而且,1000并发居然比100并发速度还要快一些。
下面给出一些对比数据,测试环境不同,但是数据不会相差太大:
1、大部分python web framework,600req/s
2、web.py,800req/s
3、曾经在土豆网用twisted写的htmid框架,2300req/s
4、nginx+mod_wsgi,2900req/s
5、eventlet,约5800req/s
当然,如上的服务器功能确实少了点,但是提供了这样一种基础,方便以后扩展。记得N年前看过一篇论文说服务器的发展是多进程=>多线程=>异步=>协程。而现在主流的高性能服务器都是基于异步的(lighttpd、nginx),这次试了一下协程,效果果然不同凡响。
过段时间试试用eventlet提供服务器做个wsgi/http服务器来玩。
分享到:
相关推荐
Greenlet是python的一个C扩展,旨在提供可自行调度的‘微线程’, 即协程。generator实现的协程在yield value时只能将value返回给调用者(caller)。 而在greenlet中,target.switch(value)可以切换到指定的协程...
orchid是一个构建于强大的boost库基础上的C 库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型。 协程,顾名思义,协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程...
greenlet-1.1.1-cp38-cp38-win32
资源分类:Python库 所属语言:Python 资源全名:greenlet-1.0a1-cp36-cp36m-manylinux1_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
使用packstack安装redhat openstack10,报错:Error appeared during Puppet run: x.x.x.x_controller.pp ,经检查日志,原因是python-greenlet包未安装,且版本需要大于.0.3.1 安装此包,就ok啦。
离线安装包,亲测可用
diesel:基于Greenlet 的事件 I/O Python框架
python3.8版本的greenlet wheel文件,pip安装某个库失败的时候,如果提示greenlet安装失败,可以用这个wheel文件安装
greenlet-0.4.15-cp35-cp35m-win32
greenlet-1.1.1-cp39-cp39-win_amd64
本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下: 协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更...
greenlet-1.1.1-cp310-cp310-win_amd64
greenlet-1.1.1-cp37-cp37m-win32
greenlet-0.4.17-cp36-cp36m-win32
greenlet-0.4.15-cp35-cp35m-win_amd64
greenlet-1.1.1-cp37-cp37m-win_amd64
资源来自pypi官网。 资源全名:greenlet-0.4.0-py2.7-win-amd64.egg
greenlet-0.4.15-cp34-cp34m-win32
资源来自pypi官网。 资源全名:greenlet-0.4.3.win-amd64-py2.7.exe