我正在尝试为通过WebSocket向一系列客户端广播信息的服务器构建一个小型状态监视器。为此,我正在使用tornado.process.Subprocess
以及/proc/
目录下的各种文件读取几个命令的输出。我想知道如何异步地异步读取不同命令的输出,更新WebSocket通道将向客户端广播的值的字典。异步读取Tornado中的多个文件
我尝试使用gen.coroutine
和yield
与阵列中的每个Subprocess
调用返回的所有DummyFuture
对象不幸无济于事。这里是我的代码的简化版本:
def get_data(*args, **kwargs):
response_dict = {}
fd_uname = process.Subprocess("uname -r", shell=True, stdout=process.Subprocess.STREAM).stdout
f_uname = fd_uname.read_until_close() # A DummyFuture is generated
fd_uptime = process.Subprocess("uptime | tail -n 1 | awk '{print $3 $4 $5}'", shell=True, stdout=subprocess.PIPE).stdout
f_uptime.read_until_close()
# In the end, the results will be stored as entries of response_dict
data_dict = {}
def process_data():
result = get_data() # The goal is to run this function asynchronously
data_dict = result
open_ws = set()
class WebSocketIndexHandler(websocket.WebSocketHandler):
def open(self):
open_ws.add(self)
self.callback = PeriodicCallback(self.send_data, 1000)
self.callback.start()
start_callback()
def send_data(self):
self.write_message(data_dict)
def on_close(self):
self.callback.stop()
open_ws.remove(self)
ProcessCallback(get_data, 1000)
我想用的read_until_close
的callback
参数作为一种解决方案,指派另一个回调参数get_data
)当所有其他期货成功解决那被称为的,但我发现该解决方案相当麻烦。
提前致谢!
你也可以看看[run_on_executor](http://blog.trukhanov.net/Running-synchronous-code-on-tornado-asynchronously/)装饰 – desertkun