关于单线程epoll模型服务器的一点说明

现在的不少高性能服务器都是用epoll模型单线程的模式

它的优点在于:

1. 单线程避免了多线程切换带来的上下文切换开销

2. epoll 模型优于select是因为无需阻塞在等待io等待上,而是去处理前一个已经就绪的事件(前一个请求的数据已经到达了或者说是就绪的)

它只是无阻塞的网络模型,对于回调函数,它依然是可以阻塞的。


因此如果回调函数中有阻塞事件,多线程的运行效率可能优于单线程

测试方法:

使用ab压测

ab -c 5 -n 10000 http://localhost:8080/

实验1: 回调函数中无阻塞

1) 单线程

from twisted.internet import epollreactor
epollreactor.install()

from twisted.internet import reactor
from twisted.web import server, resource
import time
class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        #time.sleep(0.5)
        return "Hello, world!"
import sys
print sys.modules['twisted.internet.reactor']
site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()

2) 多线程

from twisted.internet import epollreactor
epollreactor.install()

from twisted.internet import reactor

from twisted.web import server
from twisted.web.wsgi import WSGIResource
from twisted.python.threadpool import ThreadPool
from twisted.application import service, strports
from twisted.web.server import Site
import time
# Create and start a thread pool,
wsgiThreadPool = ThreadPool()
wsgiThreadPool.start()

# ensuring that it will be stopped when the reactor shuts down
reactor.addSystemEventTrigger('after', 'shutdown', wsgiThreadPool.stop)
         
def application(environ, start_response):
    """A basic WSGI application"""
    #time.sleep(0.5)
    start_response('200 OK', [('Content-type','text/plain')])
    return ['hello world']

# Create the WSGI resource 
wsgiAppAsResource = WSGIResource(reactor, wsgiThreadPool, application)
    
    

reactor.listenTCP(8080, Site(wsgiAppAsResource))
reactor.run()

实验结果:

类型 request/sec
单线程 1339.98
多线程 1047.78

实验2: 回调函数中有阻塞

只需加入sleep函数即可

time.sleep(0.5)

实验结果:

类型 request/sec
单线程 1.99
多线程 9.90


实验说明一切。


你可能感兴趣的:(关于单线程epoll模型服务器的一点说明)