我正在尝试为服务器构建一个小型状态监视器,该服务器通过Websocket将信息广播到一系列客户端。为此,我正在使用tornado.process.Subprocess
以及/proc/
目录下的各种文件读取多个命令的输出。我想知道如何异步读取不同命令的输出,更新了Websocket Channels将向客户端广播的值字典。
我尝试使用gen.coroutine
和yield
使用每个DummyFuture
呼叫返回的所有CC_5对象的数组,不幸的是无用。这是我的代码的简化版本:
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
(,当所有其他期货成功解决时,它将被调用,但是我发现该解决方案相当麻烦。
预先感谢!
从另一个coroutine调用coroutine,您需要在python 3.5 中需要" async def"one_answers"等待",或者是" gen. -coroutine"one_answers" targe"。这是现代语法:
async def get_data(*args, **kwargs):
response_dict = {}
fd_uname = process.Subprocess("uname -r", shell=True, stdout=process.Subprocess.STREAM).stdout
uname_result = await fd_uname.read_until_close()
fd_uptime = process.Subprocess("uptime | tail -n 1 | awk '{print $3 $4 $5}'", shell=True, stdout=subprocess.PIPE).stdout
uptime_result = await f_uptime.read_until_close()
# In the end, the results will be stored as entries of response_dict
return response_dict
async def process_data():
result = await get_data() # The goal is to run this function asynchronously
# Now do something with the result....
当然,请确保您从龙卷风导入子过程,而不是从标准库中。
有关更多信息,请参阅《我的重构龙卷风Coroutines》或《龙卷风Coroutine指南》。