2016-02-19 48 views
0

我試圖製作一個使用Tornado的非阻塞TCP服務器。Tornado框架中的IOLoop.instance.start()阻止了執行

所以我子類TCPServer作爲API規定和實施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

龍捲風的doc

循環將運行,直到回調調用停止(),這將 使循環停止當前事件的迭代完成後的一個。

換句話說 - 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') 
+0

如果我不想用'fork_processes'?我應該在'coroutine'內使用'yield'嗎? – k4ppa

相關問題