Python Tornado websocket异步写入消息
我希望以一种不会阻止任何其他请求发生的方式将来自各种传感器的数据流传输到tornado中,并提出了我认为允许我这样做的方法,但现在遇到了以下问题:Python Tornado websocket异步写入消息,python,asynchronous,websocket,tornado,python-asyncio,Python,Asynchronous,Websocket,Tornado,Python Asyncio,我希望以一种不会阻止任何其他请求发生的方式将来自各种传感器的数据流传输到tornado中,并提出了我认为允许我这样做的方法,但现在遇到了以下问题: TypeError:object Timestamp不能用在'wait'表达式中 我通过各种线程寻找解决方案,主要是: 所讨论的基本代码: class ListenerHandler(WebSocket): executor = ThreadPoolExecutor() async def on_message(self, se
TypeError:object Timestamp不能用在'wait'表达式中
我通过各种线程寻找解决方案,主要是:
所讨论的基本代码:
class ListenerHandler(WebSocket):
executor = ThreadPoolExecutor()
async def on_message(self, sensor):
sensor = get_single_actor(sensor)
sensor.listen(lambda data: IOLoop.current().run_in_executor(
self.executor, self.write_message(str(data))))
while True:
await world.wait_for_tick()
我不确定这个块中的各种事情是否需要更多的上下文,因为在阅读之后,我感觉这可能只是一个需要处理的一般python异步事情,要点是:需要运行无限循环,而不是块请求
在it阶段,我正式进入掷镖阶段。在
wait
语句中只能使用协同程序<代码>等待勾号()需要是一个协同程序。您得到错误是因为它不是。协同程序是使用async def
语句定义的函数。因此,通过使用async def
定义函数,将wait\u for_tick()
函数转换为协同程序。感谢您的响应!wait_for_tick()实际上来自一个包。我能做些什么鬼鬼祟祟的事情来绕过它吗?或者我必须深入其中并将其定义为异步吗?如果wait\u tick()
不是一个协同程序,那么就没有必要在wait
语句中使用它WAIT
语句用于暂时挂起循环,直到协同路由返回值。但是由于wait_for_tick()
只是一个常规函数,它会立即返回一个值,而while
循环将继续运行而不会挂起。但是,如果您仍然希望以这种方式使用它,那么您可以创建一个单独的协程并返回wait_for_tick()
,而不是直接调用wait_for tick()
来自该协同程序。然后您可以在await
语句中使用此协同程序。但正如我所说,它不会真正使您的代码异步。您可以告诉我们更多您试图实现的目标,我们可以为您提供更好的解决方案。您需要切换到公开异步接口的库,或者(ab)使用线程等待阻塞代码。在后一种情况下,您可以wait loop.run\u In\u executor(executor,world.wait\u for\u tick
)。