Python 如何记录tornado套接字接受时间?

Python 如何记录tornado套接字接受时间?,python,tornado,Python,Tornado,当我阅读tornado源代码时,我希望记录每个套接字接受时间,因此我添加了一个类似以下内容的登录接受\处理程序: def accept_handler(fd, events): for i in xrange(_DEFAULT_BACKLOG): if removed[0]: # The socket was probably closed return try: connection

当我阅读tornado源代码时,我希望记录每个套接字接受时间,因此我添加了一个类似以下内容的登录接受\处理程序:

def accept_handler(fd, events):
    for i in xrange(_DEFAULT_BACKLOG):
        if removed[0]:
            # The socket was probably closed
            return
        try:
            connection, address = sock.accept()
        except socket.error as e:
            # _ERRNO_WOULDBLOCK indicate we have accepted every
            # connection that is available.
            if errno_from_exception(e) in _ERRNO_WOULDBLOCK:
                return
            # ECONNABORTED indicates that there was a connection
            # but it was closed while still in the accept queue.
            # (observed on FreeBSD).
            if errno_from_exception(e) == errno.ECONNABORTED:
                continue
            raise
        set_close_exec(connection.fileno())
        gen_log.warning('accept at {}'.format(io_loop.time()))
        callback(connection, address)
[W 170916 22:06:01 netutil:278] accept at 1505624761.04
sleep at 1505624761.04
wake at 1505624764.04
[I 170916 22:06:04 web:2063] 200 GET / (192.168.10.243) 3005.47ms
[W 170916 22:06:04 netutil:278] accept at 1505624764.04
sleep at 1505624764.04
wake at 1505624767.05
[I 170916 22:06:07 web:2063] 200 GET / (192.168.10.243) 3005.02ms
[W 170916 22:06:07 netutil:278] accept at 1505624767.05
sleep at 1505624767.05
wake at 1505624770.05
[I 170916 22:11:06 web:2063] 200 GET / (192.168.10.243) 3003.87ms
[W 170916 22:11:06 netutil:278] accept at 1505625066.86
sleep at 1505625066.86
wake at 1505625069.86
[I 170916 22:11:09 web:2063] 200 GET / (192.168.10.243) 3002.22ms
[W 170916 22:11:09 netutil:278] accept at 1505625069.86
sleep at 1505625069.86
wake at 1505625072.87
[I 170916 22:11:12 web:2063] 200 GET / (192.168.10.243) 3004.91ms
[W 170916 22:11:12 netutil:278] accept at 1505625072.87
sleep at 1505625072.87
wake at 1505625075.87
[I 170916 22:11:15 web:2063] 200 GET / (192.168.10.243) 3004.71ms
[W 170916 22:11:15 netutil:278] accept at 1505625075.87
sleep at 1505625075.87
wake at 1505625078.88
[I 170916 22:11:18 web:2063] 200 GET / (192.168.10.243) 3006.12ms
[W 170916 22:11:18 netutil:278] accept at 1505625078.88
sleep at 1505625078.88
wake at 1505625081.89
[I 170916 22:11:21 web:2063] 200 GET / (192.168.10.243) 3006.07ms
[W 170916 22:11:21 netutil:278] accept at 1505625081.89
sleep at 1505625081.89
wake at 1505625084.89
[I 170916 22:11:24 web:2063] 200 GET / (192.168.10.243) 3005.07ms
[W 170916 22:11:24 netutil:278] accept at 1505625084.9
sleep at 1505625084.9
wake at 1505625087.9
[I 170916 22:11:27 web:2063] 200 GET / (192.168.10.243) 3006.34ms
我的处理程序是一个阻塞函数,它阻塞ioloop3s并返回“helloworld”

然后我通过线程同时发送10个请求,我发现tornado日志如下:

def accept_handler(fd, events):
    for i in xrange(_DEFAULT_BACKLOG):
        if removed[0]:
            # The socket was probably closed
            return
        try:
            connection, address = sock.accept()
        except socket.error as e:
            # _ERRNO_WOULDBLOCK indicate we have accepted every
            # connection that is available.
            if errno_from_exception(e) in _ERRNO_WOULDBLOCK:
                return
            # ECONNABORTED indicates that there was a connection
            # but it was closed while still in the accept queue.
            # (observed on FreeBSD).
            if errno_from_exception(e) == errno.ECONNABORTED:
                continue
            raise
        set_close_exec(connection.fileno())
        gen_log.warning('accept at {}'.format(io_loop.time()))
        callback(connection, address)
[W 170916 22:06:01 netutil:278] accept at 1505624761.04
sleep at 1505624761.04
wake at 1505624764.04
[I 170916 22:06:04 web:2063] 200 GET / (192.168.10.243) 3005.47ms
[W 170916 22:06:04 netutil:278] accept at 1505624764.04
sleep at 1505624764.04
wake at 1505624767.05
[I 170916 22:06:07 web:2063] 200 GET / (192.168.10.243) 3005.02ms
[W 170916 22:06:07 netutil:278] accept at 1505624767.05
sleep at 1505624767.05
wake at 1505624770.05
[I 170916 22:11:06 web:2063] 200 GET / (192.168.10.243) 3003.87ms
[W 170916 22:11:06 netutil:278] accept at 1505625066.86
sleep at 1505625066.86
wake at 1505625069.86
[I 170916 22:11:09 web:2063] 200 GET / (192.168.10.243) 3002.22ms
[W 170916 22:11:09 netutil:278] accept at 1505625069.86
sleep at 1505625069.86
wake at 1505625072.87
[I 170916 22:11:12 web:2063] 200 GET / (192.168.10.243) 3004.91ms
[W 170916 22:11:12 netutil:278] accept at 1505625072.87
sleep at 1505625072.87
wake at 1505625075.87
[I 170916 22:11:15 web:2063] 200 GET / (192.168.10.243) 3004.71ms
[W 170916 22:11:15 netutil:278] accept at 1505625075.87
sleep at 1505625075.87
wake at 1505625078.88
[I 170916 22:11:18 web:2063] 200 GET / (192.168.10.243) 3006.12ms
[W 170916 22:11:18 netutil:278] accept at 1505625078.88
sleep at 1505625078.88
wake at 1505625081.89
[I 170916 22:11:21 web:2063] 200 GET / (192.168.10.243) 3006.07ms
[W 170916 22:11:21 netutil:278] accept at 1505625081.89
sleep at 1505625081.89
wake at 1505625084.89
[I 170916 22:11:24 web:2063] 200 GET / (192.168.10.243) 3005.07ms
[W 170916 22:11:24 netutil:278] accept at 1505625084.9
sleep at 1505625084.9
wake at 1505625087.9
[I 170916 22:11:27 web:2063] 200 GET / (192.168.10.243) 3006.34ms

看起来像是tornado进程一个接一个地请求,但我认为这不是真的,我使用wireshark发现所有连接都在很短的时间内被接受,所以我不知道如何添加日志来显示每个套接字接受时间。

我想我问这个问题的原因是我对套接字的误解


当我阅读tornado源代码时,我认为在服务器名为sock.accept之后,连接状态变为已建立,这不是真的,即使我没有启动ioloop,客户端也可以连接到服务器,并且这些套接字可以建立,除非达到默认的listen backlog128。

在tornado中,阻塞处理程序会阻止一切。这包括,在本例中,接受的下一个调用以及在接受循环结束时对回调的调用最终将到达处理程序。要在Tornado中实现任何并发,必须使所有处理程序在IOLoop线程上都不阻塞。您可以使用ThreadPoolExecutor将工作移动到其他线程,在这些线程中,您可以根据自己的需要进行阻塞,但不能调用其他Tornado方法