我正在嘗試爲通過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