簡體   English   中英

在 Python 中本地使用多個異步生成器

[英]Consuming multiple async generators natively in Python

我正在嘗試用 Python 創建一個簡單的網絡監控應用程序。 它本質上應該:

  • 無限同時運行多個腳本(在這種情況下,像“ping”和“traceroute”這樣的bash命令)
  • 從每個子流程的輸出中提取每一行; 然后每一行都應該在程序的其他地方使用並發送到 Kafka 主題
  • 對主題做一些額外的處理並將數據發送到 InfluxDB(但這不太相關——我用 Faust 做)。

我做了什么:

我嘗試使用異步生成器:

async def run(command: str):
    proc = await asyncio.create_subprocess_shell(
        command,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )
    while True:
        line = await proc.stdout.readline()
        if line: yield line

然后在程序的其他地方使用它:

...
async for output_line in run("some_command"):
        # do something with line

這適用於單個子進程,但是我不確定當我需要多個異步生成器並行運行並並行使用時該怎么做 - 有些可能像asyncio.gather ,但對於異步生成器。

您認為這樣做的最佳方法是什么? 經過搜索,我找到了aiostream模塊,它可以像這樣合並多個異步生成器。 然后,我可以使用該行生成一個元組,例如我給出的命令,以識別輸出行來自哪個生成器。

但是,也許有一個更簡單的解決方案,希望是原生解決方案?

謝謝!

您正在尋找的是asyncio.gather ,它同時運行多個等待對象。

要使用它,我認為您的首要任務是將解析代碼包裝到一個函數中,例如:

async def parse(cmd):
    async for output_line in run(cmd):
        # something

然后在另一個函數/上下文中,用收集包裝解析:

result = await asyncio.gather(
    parse("cmd1"),
    parse("cmd2"),
    parse("cmd3"),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM