当我阅读龙卷风源代码时,我想记录每个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
个接受时间。
答案 0 :(得分:0)
我认为我之所以会问这个问题的原因是因为我对socket
的误解。
当我阅读tornado
源代码时,我想在服务器名为sock.accept
之后,连接状态变为ESTABLISHED
,这不是真的,即使我没有启动{{1}客户端可以连接到服务器,并且可以建立这些套接字,除非达到默认监听ioloop
。
答案 1 :(得分:0)
在Tornado中,阻止处理程序会阻止所有内容。在这种情况下,这包括对accept()
的下一次调用(在接受循环结束时对callback()
的调用最终会到达处理程序)。要在Tornado中实现任何并发性,必须使所有处理程序都不阻塞(在IOLoop线程上。您可以使用ThreadPoolExecutor将工作移动到其他线程,并且在这些线程中,您可以根据需要阻止,但是您可以&# 39; t调用其他Tornado方法)。