2016-12-05 2 views
1

У меня возникли проблемы с получением TCPClient и TCPServer в Tornado.async с Tornado TCPClient и TCPServer

У меня есть следующий код сервера:

from tornado import gen 
from tornado.ioloop import IOLoop 
from tornado.iostream import IOStream, StreamClosedError 
from tornado.tcpclient import TCPClient 
from tornado.tcpserver import TCPServer 
from tornado.platform.asyncio import to_tornado_future, to_asyncio_future 


class MyServer(TCPServer): 

    async def handle_stream(self, stream, address): 
     try: 
      while True: 
       encoded="***".encode() 
       msg= await stream.read_until(encoded) 
       print(msg) 

     except StreamClosedError: 
      print("connection error") 

server = MyServer() 
server.listen(10000) 
IOLoop.current().start() 

и следующий код клиента:

from tornado import gen 
from tornado.ioloop import IOLoop 
from tornado.iostream import IOStream, StreamClosedError 
from tornado.tcpclient import TCPClient 
from tornado.platform.asyncio import to_tornado_future, to_asyncio_future 
tcp_client = TCPClient() 


async def client(): 
    while True: 
     try: 
      stream = await tcp_client.connect('localhost', 10000) 

      # Set TCP_NODELAY/disable Nagle's Algorithm. 
      stream.set_nodelay(True) 

      while True: 
       msg ="hello ***" 
       await stream.write(msg.encode()) 
       await gen.sleep(5) 

     except StreamClosedError as exc: 
      print("error connecting") 

loop = IOLoop.current() 
loop.spawn_callback(client) 
loop.start() 

Я постоянно получаю предупреждения на стороне сервера, handle_stream никогда не ждали:

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tornado-4.4.2-py3.5-macosx-10.6-intel.egg/tornado/netutil.py:272: RuntimeWarning: coroutine 'MyServer.handle_stream' was never awaited 
    callback(connection, address) 
ERROR:tornado.application:Error in connection callback 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tornado-4.4.2-py3.5-macosx-10.6-intel.egg/tornado/tcpserver.py", line 276, in _handle_connection 
    self.io_loop.add_future(future, lambda f: f.result()) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tornado-4.4.2-py3.5-macosx-10.6-intel.egg/tornado/ioloop.py", line 593, in add_future 

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно, и как я могу получить эту работу g с async и ждать.

это связано со следующим вопросом, что Джесси любезно ответил:

Tornado TCP Server/Client process communication

Я пытался получить его код работы с асинхронной и ждут, однако были те же проблемы .... Если я изменю выше код для использования yield и сопрограммы он работает ...

+0

Какая версия торнадо? 'TCPServer.handle_stream' не разрешалось быть сопрограммой до версии 4.2. –

+0

Привет, Бен Я использую последнюю версию торнадо-4.4.2. Я добавил исключение, которое я получаю именно тогда ... –

ответ

2

Я вижу проблему, исправит здесь: github.com/tornadoweb/tornado/pull/1906 тем временем я думаю, что handle_stream не может быть родной сопрограммой, по крайней мере, не любым удобным способом.

+0

Привет, Джесси, я надеюсь, что у тебя все хорошо. Могу ли я использовать старый стиль @ co-rout? похоже, это работает. Я собирался включить в async и ждать, используя to_asyncio_future() меньше, чем идеальный, но обходной путь на данный момент ... С вашим github pull, как это работает? Могу ли я загрузить вашу исправленную версию сейчас или мне нужно подождать следующего релиза торнадо? –

+0

Сладкий Джесси хорошо работает! Большое спасибо за это –

+0

Конечно, используйте @ gen.coroutine, сейчас есть небольшой удар по производительности, но это, безусловно, правильно. –