Вызов сопрограмм в asyncio.Protocol.data_received

У меня проблемы с асинхроннымasyncio.Protocol.data_received обратный вызов нового Pythonasyncio модуль.

Рассмотрим следующий сервер:

class MathServer(asyncio.Protocol):

   @asyncio.coroutine
   def slow_sqrt(self, x):
      yield from asyncio.sleep(1)
      return math.sqrt(x)

   def fast_sqrt(self, x):
      return math.sqrt(x)

   def connection_made(self, transport):
      self.transport = transport

   #@asyncio.coroutine
   def data_received(self, data):
      print('data received: {}'.format(data.decode()))
      x = json.loads(data.decode())
      #res = self.fast_sqrt(x)
      res = yield from self.slow_sqrt(x)
      self.transport.write(json.dumps(res).encode('utf8'))
      self.transport.close()

используется со следующим клиентом:

class MathClient(asyncio.Protocol):

   def connection_made(self, transport):
      transport.write(json.dumps(2.).encode('utf8'))

   def data_received(self, data):
      print('data received: {}'.format(data.decode()))

   def connection_lost(self, exc):
      asyncio.get_event_loop().stop()

С участиемself.fast_sqrt будучи вызванным, все работает как ожидалось.

С участиемself.slow_sqrt, это не работает.

Это также не работает сself.fast_sqrt и@asyncio.coroutine декоратор наdata_received.

Я чувствую, что упускаю что-то фундаментальное здесь.

Полный код здесь:

серверклиент

Протестировано с:

Python 3.4.0b1 (Windows)Python 3.3.3 + asyncio-0.2.1 (FreeBSD)

Проблема одинакова на обоих: сslow_sqrtклиент / сервер просто зависнет, ничего не делая.

Ответы на вопрос(1)

Ваш ответ на вопрос