当我阅读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)
我的处理程序是一个阻塞函数,它阻塞IOLOOP3S并返回'Hello World'。
[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
在龙卷风中,阻塞处理程序阻塞一切。在本例中,这包括对accept()
的下一次调用(accept循环末尾对callback()
的调用最终将到达处理程序)。要在Tornado中实现任何并发,您必须使所有处理程序都是非阻塞的(在IOLoop线程上。您可以使用ThreadPoolExecutor将工作转移到其他线程,在这些线程中,您可以任意阻塞,但不能调用其他Tornado方法)。
我正在尝试基于非阻塞NIO消息开发自己的通信库。我已经阅读了1000篇关于它的教程和书中的章节,我认为最后我有了一些可以在几乎没有同时连接的情况下工作的东西。但是当我在服务器端有很多连接共存时,我遇到了一些问题。 我有4个私有方法的典型选择器实现:accept、finishConnect、read和write。我的问题在于前两个:接受和完成连接。 当客户端打开一个新的套接字,并且一个可接受的键唤醒
问题内容: 我有一个基本的Tornado websocket测试: 我希望能够处理多个连接(似乎已经做到了),而且还能够引用其他连接。我没有一种方法来识别和跟踪单个连接,只是为了能够处理打开连接,接收消息和关闭连接时的事件。 [编辑] 想创建一个dict,其中键是Sec-websocket-key,值是WSHandler对象…。我不确定Sec-websocket-key的可靠性如何。 问题答案:
我试图编写一个龙卷风请求处理程序,它生成异步HTTP请求,并在客户端从异步请求接收数据时将数据返回给客户端。不幸的是,我无法让龙卷风返回任何数据到客户端,直到它的所有异步HTTP请求都完成。 下面是我的请求处理程序的演示。 我希望对这个处理程序的GET请求最初返回文本“some opening”,然后很快为小请求返回“some chunk”,然后为大请求返回“some chunk”(可能多次),最
我阅读了tornado和相关模块,以了解当接受套接字并解析和处理请求时,tornado会做什么。 然后我向tornado发送一些请求,所有请求都被设置为读取超时3秒,我在tornado上发现了一些连接,几分钟后,这些连接正常关闭。 我猜5秒处理程序是减缓tornado的事件循环,当tornado处理第二个处理程序时,它的连接已经关闭,如果tornado知道了,它就不需要再做下一步了。
问题内容: 请帮助我创建HTTPS龙卷风服务器我当前的代码Python3不起作用 HTTPS对我来说很重要,请帮忙 问题答案: 无需使用。 请尝试以下操作:
问题内容: 我想用Tornado运行一个用Flask编写的简单应用程序。我该怎么做呢?我想使用Python 2.7和最新的Tornado版本(4.2)。 问题答案: Flask文档用于描述如何执行此操作,但是由于以下性能说明而已被删除。除非所有异步代码都已经用Tornado编写,否则您不需要Tornado来提供Flask应用程序。 关于WSGI的Tornado文档也对此进行了描述。它们还包括一个重