Вызов сопрограмм в 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
клиент / сервер просто зависнет, ничего не делая.