我试图使用Tornado创建一个非阻塞的TCP服务器。
所以我已按照API中所述的TCPServer
进行了子类化并实施了handle_stream
但是当执行范围IOLoop.current().start()
没有继续进行时。
在所有示例中,我都看到TCPServer
的工作原理。
我认为我完全不了解这项技术。我错过了什么?为什么永远不会达到IOLoop.instance().stop()
?
import logging
import tornado
from tornado import gen
from tornado.tcpserver import TCPServer
from tornado.ioloop import IOLoop
from tornado.netutil import bind_sockets
class CashDeskTCPServer(TCPServer):
@gen.coroutine
def handle_stream(self, stream, address):
self._stream = stream
self._read_line()
@gen.coroutine
def _read_line(self):
self._stream.read_until('\n', self._handle_read)
@gen.coroutine
def _handle_read(self, data):
self._stream.write(data)
self._read_line()
if __name__ == '__main__':
sockets = bind_sockets(8889)
tornado.process.fork_processes(0)
server = CashDeskTCPServer()
server.add_sockets(sockets)
IOLoop.instance().start()
IOLoop.instance().stop()
答案 0 :(得分:0)
龙卷风' doc:
循环将一直运行,直到其中一个回调调用stop(),这将是 在当前事件迭代完成后使循环停止。
换句话说 - IOLoop的开始是阻止,而它运行。如果循环停止,将执行下一个语句。此外,停止ioloop意味着停止收听(接受新的连接)。
但是既然你使用fork_processes(0),你可能想在除了一个之外的所有进程上运行ioloop(父级 - 让我们说主人)
if __name__ == '__main__':
sockets = bind_sockets(8889)
tornado.process.fork_processes(0)
server = CashDeskTCPServer()
server.add_sockets(sockets)
# if you have 1 core there is no forks, so no ioloop will start
if tornado.process.task_id() != 0:
IOLoop.instance().start()
else:
print('Master process didn't start IOLoop')