python 协程 - asyncio-subprocess 并发执行命令
1. 10秒钟测试ip段所有IP的连通性
(base) [root@wlt-overseas-middleware-master ~]# cat su-asyncio-re-cancel.py import asyncio import time import re # call shell cmd and get exec return code async def run(cmd): proc = await asyncio.subprocess.create_subprocess_shell( cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) stdout, stderr = await proc.communicate() # print('cmd: {}, returncode: {}'.format(cmd, proc.returncode)) if stdout: stdout = str(stdout) # print("\033[1;{};1m{}\033[0m".format(32, stdout)) re_result = re.findall('Escape character is', stdout) if re_result: print("\033[1;{};1m{}\033[0m".format(32, stdout)) if stderr: # print("\033[1;{};1m{}\033[0m".format(31, stderr)) pass # call many machines use run async def run_cmd_in_all_remotes(ips): tasks_list = [] for ip in ips: cmd = "sleep 1 |telnet " + ip + ' 22' task = asyncio.create_task(run(cmd)) tasks_list.append(task) await asyncio.sleep(20) for task in tasks_list: task.cancel()
# task.cancel() 要在gather之前才能生效 await asyncio.gather(*tasks_list, return_exceptions=True) def main(): ips = [('10.0.0.' + str(ip)) for ip in range(1, 256)] asyncio.run(run_cmd_in_all_remotes(ips)) if __name__ == '__main__': start_time = time.perf_counter() main() end_time = time.perf_counter() print('main() runtime {}'.format(end_time - start_time))
(base) [root@wlt-overseas-middleware-master ~]# python su-asyncio-re-cancel.py b"Trying 10.0.0.2...\r\nConnected to 10.0.0.2.\r\nEscape character is '^]'.\r\nSSH-2.0-OpenSSH_7.4\n" b"Trying 10.0.0.4...\r\nConnected to 10.0.0.4.\r\nEscape character is '^]'.\r\nSSH-2.0-OpenSSH_7.4\n" b"Trying 10.0.0.7...\r\nConnected to 10.0.0.7.\r\nEscape character is '^]'.\r\nSSH-2.0-OpenSSH_7.4\n"
参考: 官网 官方文档: https://docs.python.org/zh-cn/3.9/library/asyncio-subprocess.html
用一个例子来演示会更加清晰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2018-02-13 python 连接操作mysql数据库
2018-02-13 (转)postfix疯狂外发垃圾邮件之分析与解决
2018-02-13 ansible 常用方法