龙卷风中多个文件的异步读取



我正在尝试为服务器构建一个小型状态监视器,该服务器通过Websocket将信息广播到一系列客户端。为此,我正在使用tornado.process.Subprocess以及/proc/目录下的各种文件读取多个命令的输出。我想知道如何异步读取不同命令的输出,更新了Websocket Channels将向客户端广播的值字典。

我尝试使用gen.coroutineyield使用每个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_closecallback参数作为解决方案,将另一个回调参数分配给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指南》。

最新更新