真正的 Tornado 异步非阻塞
前言:
其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado。
但是在实际使用过程中很容易把 Tornado 使用成异步阻塞框架,这样对比其他两大框架没有任何优势而言,本文就如何实现真正的异步非阻塞记录。
笔记:
- 默认情况下tornado是单线程阻塞模式,如果阻塞所有请求都需要等待
- tornado.web.asynchronous可以异步使用,得益于AsyncHTTPClient模块的配合使用,两者缺一不可
- tornado.gen.coroutine严重依赖第三方库的使用,如果没有第三方库的支持则依然是阻塞模式
- Tornado 提供了多种的异步编写形式:回调、Future、协程等,其中以协程模式最是简单和用的最多
- Tornado 实现异步的多种方式:coroutine配合第三方库、启用多线程、使用celery等
1、使用 gen.coroutine 异步编程
在 Tornado 中两个装饰器:
- tornado.web.asynchronous
- tornado.gen.coroutine
① asynchronous 装饰器是让请求变成长连接的方式,必须手动调用 self.finish() 才会响应
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
# bad
self.write("Hello, world")
asynchronous 装饰器不会自动调用self.finish() ,如果没有没有指定结束,该长连接会一直保持直到 pending 状态
所以正确是使用方式是使用了 asynchronous 需要手动 finish
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.write("Hello, world")
self.finish()
② coroutine 装饰器是指定改请求为协程模式,说明白点就是能使用 yield 配合 Tornado 编写异步程序。
Tronado 为协程实现了一套自己的协议,不能使用 Python 普通的生成器。
在使用协程模式编程之前要知道如何编写 Tornado 中的异步函数,Tornado 提供了多种的异步编写形式:回调、Future、协程等,其中以协程模式最是简单和用的最多。
编写一个基于协程的异步函数同样需要 coroutine 装饰器
@gen.coroutine
def sleep(self):
yield gen.sleep(10)
raise gen.Return([1, 2, 3, 4, 5])
这就是一个异步函数,Tornado 的协程异步函数有两个特点:
- 需要使用 coroutine 装饰器
- 返回值需要使用
raise gen.Return()当做异常抛出
返回值作为异常抛出是因为在 Python 3.2 之前生成器是不允许有返回值的。
使用过 Python 生成器应该知道,想要启动生成器的话必须手动执行 next() 方法才行,所以这里的 coroutine 装饰器的其中一个作用就是在调用这个异步函数时候自动执行生成器。
使用 coroutine 方式有个很明显是缺点就是严重依赖第三方库的实现,如果库本身不支持 Tornado 的异步操作再怎么使用协程也是白搭依然会是阻塞的,放个例子感受一下
import time
import logging
import tornado.ioloop
import tornado.web
import tornado.options
from tornado import gen
tornado.options.parse_command_line()
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.write("Hello, world")
self.finish()
class NoBlockingHnadler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
yield gen.sleep(2)
self.write('Blocking Request')
class BlockingHnadler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
time.sleep(2)
self.write('Blocking Request')
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r"/block", BlockingHnadler),
(r"/noblock", NoBlockingHnadler),
], autoreload=True)
if __name__ == "__main__":
app = make_app()
app.listen(8001)
tornado.ioloop.IOLoop.current().start()
当我们使用 yield gen.sleep(10) 这个异步的 sleep 时候,请求是不阻塞的。
[root@localhost ~]# siege http://192.168.0.2:8001/noblock -c100 -t10s ** SIEGE 3.0.8 ** Preparing 100 concurrent users for battle. The server is now under siege... HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.88 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.88 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.88 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.87 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.85 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.86 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.83 secs: 16 bytes ==> GET /noblock HTTP/1.1 200 1.84 secs: 16 bytes ==> GET /noblock Lifting the server siege... done. Transactions: 337 hits Availability: 100.00 % Elapsed time: 9.35 secs Data transferred: 0.01 MB Response time: 1.85 secs Transaction rate: 36.04 trans/sec Throughput: 0.00 MB/sec Concurrency: 66.55 Successful transactions: 337 Failed transactions: 0 Longest transaction: 1.88 Shortest transaction: 1.83 FILE: /root/siege.log You can disable this annoying message by editing the .siegerc file in your home directory; change the directive 'show-logfile' to false.