Tornado源码分析3

注:在分割线之前是基于 Tornado2.4 的分析。在Tornado3.0+以后IOLoop发生了一些改动,分割线之后有相应的介绍。

IOLoop是基于epoll实现的底层网络I/O的核心调度模块,用于处理socket相关的连接、响应、异步读写等网络事件。每个Tornado进程都会初始化一个全局唯一的IOLoop实例,在IOLoop中通过静态方法instance()进行封装,获取IOLoop实例直接调用此方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
@staticmethod
def instance():
    """
    class MyClass(object):
        def __init__(self, io_loop=None):
            self.io_loop = io_loop or IOLoop.instance()
    """
    if not hasattr(IOLoop, "_instance"):
        with IOLoop._instance_lock:
            if not hasattr(IOLoop, "_instance"):
                # New instance after double check
                IOLoop._instance = IOLoop()
    return IOLoop._instance
Read on →

Tornado源码分析2

httpserver.py中给出了一个简单的http服务器的demo,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
from tornado import httpserver
from tornado import ioloop

def handle_request(request):
   message = "You requested %s\n" % request.uri
   request.write("HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s" % (
                 len(message), message))
   request.finish()

http_server = httpserver.HTTPServer(handle_request)
http_server.bind(8888)
http_server.start()
ioloop.IOLoop.instance().start()

该http服务器主要使用到IOLoop, IOStream, HTTPServer, HTTPConnection几大模块,分别在代码ioloop.py, iostream.py, httpserver.py中实现。工作的流程如下图所示:

Read on →

Tornado源码分析1

引言

Tornado是FriendFeed最早使用的一款由python编写的轻量级、无阻塞式Web服务器,还包括一些相关的工具和优化。现已由Facebook开源在github。得益于无阻塞IO和epoll(or kqueue in FreeBSD, Mac OS X)的使用,Tornado每秒可以处理大量/数千的客户端连接,适用于实时的Web服务(详细可以参阅The C10K problem)。

接下来几篇文章将会从Web服务器框架设计、代码实现细节等角度介绍我对Tornado源码的分析。这篇文章作为概述,首先介绍Tornado的模块按功能分类,同时提供后续文章的结构目录。

Read on →

Bash Subshell变量作用域问题

今天研究apache ab这个测试工具,在网上看到压力测试shell脚本一文介绍了一个封装的bash脚本,用于多次测试返回requests per second的平均值,对脚本进行了简单的改写,将所有的测试输出进行记录。改写脚本在文章的最后。

改写过程中发现这样一个问题,比如写下面的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

result=""
cat abtest_temp.log | while read LINE
do
    result=`echo $LINE | grep 'Requests per second:'`
    if [ "$result" != "" ]
    then
        break
    fi
done
echo "result is "${result}
Read on →

How to Build This Blog

系统环境Mac OS X 10.8.2,这个博客主要通过jekyll生成静态页面,使用ruby提供的一些扩展插件,比如按月份进行归档等,配置环境的过程如下。

安装ruby,rubygems

1
2
3
4
sudo port ruby
sudo port install rb-rubygems
sudo gem install rubygems-update
sudo gem update --system

安装bundle

1
sudo gem install bundler
Read on →

随机排序算法简介

前几天看了酷壳上的一篇文章如何测试洗牌程序,之后仔细看了Wikipedia对Fisher–Yates shuffle算法的介绍,这里简单的总结一下,基本是翻译Wikipedia。

Fisher and Yates’ original method

该算法最初是1938年由Ronald A. Fisher和Frank Yates在《Statistical tables for biological, agricultural and medical research》一书中描述,算法生成1-N个数的随机排列的过程如下:

  1. 原始数组中有数字1到N
  2. 设原始数组未被标记的数字个数为k,生成一个1到k之间的随机数
  3. 取出原始数组未被标记数字中的第k个,将其标记并插入到新的排列数组尾端。
  4. 重复过程2直到原始数组中没有未被标记的数字
  5. 过程3中生成的新数组就是一个对原始数组的随机排列

该算法可以理解为已知有n个元素,先从n个元素中任选一个,放入新空间的第一个位置,然后再从剩下的n-1个元素中任选一个,放入第二个位置,依此类推。算法在过程3查找未被标记的第k个数字有很多重复操作,导致算法效率并不高,总的时间复杂度为O(N2 ),空间复杂度为O(N)。算法的python实现如下所示:

Read on →