我在覆盆子pi上运行一个Web服务器,它正在记录温度等。 我在Tornado中使用websockets与我的客户进行通信。 我希望客户端能够控制服务器何时通过套接字发送数据。
我的想法是,当客户端连接并说准备就绪时,服务器将启动一个循环,每秒记录一次临时值。但我需要这个循环以异步方式运行。这是我遇到麻烦的地方。我试着效仿,但我不能让它运行正常。
class TemperatureSocketHandler(tornado.websocket.WebSocketHandler):
@gen.coroutine
def async_func(self):
num = 0
while(self.sending):
num = num + 1
temp = self.sense.get_temperature()
yield self.write_message(str(temp))
gen.sleep(1)
def open(self):
print("Temperature socket opened")
self.sense = SenseHat()
self.sense.clear()
self.sending = False
def on_message(self, message):
if(message == "START"):
self.sending = True
if(message == "STOP"):
self.sending = False
tornado.ioloop.IOLoop.current().spawn_callback(self.async_func(self))
但是我在运行时遇到错误:
ERROR:tornado.application:Exception in callback functools.partial(<function wrap.<locals>.null_wrapper at 0x75159858>)
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.5/site-packages/tornado/ioloop.py", line 605, in _run_callback
ret = callback()
File "/home/pi/.local/lib/python3.5/site-packages/tornado/stack_context.py", line 277, in null_wrapper
return fn(*args, **kwargs)
TypeError: 'Future' object is not callable
答案 0 :(得分:1)
你必须使用IOLoop.add_future()
因为async_func()
返回Future(它被装饰为协程!)。
此外,您应该在收到开始消息时添加未来,而不是添加任何消息:
def on_message(self, message):
if(message == "START"):
self.sending = True
tornado.ioloop.IOLoop.current().add_future(
self.async_func(self), lambda f: self.close())
if(message == "STOP"):
self.sending = False