如何记录龙卷风插座接受时间?

时间:2017-09-17 05:31:57

标签: python tornado

当我阅读龙卷风源代码时,我想记录每个socket接受时间,因此我在accept_handler上添加一个日志,如下所示:

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)

我的处理程序是一个阻塞函数,它会阻止ioloop 3并返回'hello world'。

然后我通过线程同时发送10个请求,我发现龙卷风日志是这样的:

[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

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

2 个答案:

答案 0 :(得分:0)

我认为我之所以会问这个问题的原因是因为我对socket的误解。

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

答案 1 :(得分:0)

在Tornado中,阻止处理程序会阻止所有内容。在这种情况下,这包括对accept()的下一次调用(在接受循环结束时对callback()的调用最终会到达处理程序)。要在Tornado中实现任何并发性,必须使所有处理程序都不阻塞(在IOLoop线程上。您可以使用ThreadPoolExecutor将工作移动到其他线程,并且在这些线程中,您可以根据需要阻止,但是您可以&# 39; t调用其他Tornado方法)。

相关问题