这类似于在asyncio.Protocol.data_received中调用协同程序,但我认为它保证了一个新问题.
我有一个像这样的简单服务器设置
loop.create_unix_server(lambda: protocol, path=serverSocket)
Run Code Online (Sandbox Code Playgroud)
如果我这样做,它工作正常
def data_received(self, data):
data = b'data reply'
self.send(data)
Run Code Online (Sandbox Code Playgroud)
我的客户得到答复.但我不能让它与任何类型的asyncio电话一起工作.我尝试了以下所有方法,但都没有奏效.
@asyncio.coroutine
def go(self):
yield from asyncio.sleep(1, result = b'data reply')
def data_received(self, data):
print('Data Received', flush=True)
task = asyncio.get_event_loop().create_task(self.go())
data = yield from asyncio.wait_for(task,10)
self.send(data)
Run Code Online (Sandbox Code Playgroud)
没有任何东西挂起并且没有打印(如果我装饰的话data_received,@asyncio.coroutine我得到的不是那个)好的,我知道使用yield in data_received是不对的.
如果我尝试新的事件循环,如下所示,它会挂起 run_until_complete
loop = asyncio.new_event_loop()
task = loop.create_task(self.go())
loop.run_until_complete(task)
data = task.result()
self.send(data)
Run Code Online (Sandbox Code Playgroud)
如果我使用a Future,那也会挂起run_until_complete
@asyncio.coroutine
def go(self, future):
yield from asyncio.sleep(1)
future.set_result(b'data reply')
def data_received(self, …Run Code Online (Sandbox Code Playgroud)