首先定义命令任务结构体,再实现执行函数和基于channel的队列调度器,支持串行或并发执行任务。

在Go语言中,使用exec.Command执行外部命令非常常见。当需要按顺序执行多个命令或对任务进行排队处理时,可以结合Go的并发机制(如goroutine、channel)来实现命令队列和任务调度模式。下面是一个实用的命令队列与任务模式示例,适用于自动化脚本、CI/CD工具或批量运维操作等场景。
命令任务结构定义
首先定义一个任务结构体,用于封装要执行的命令及其参数:
type CommandTask struct { Name string // 任务名称(可选) Cmd string // 命令名,如 "ls", "git" Args []string // 参数列表}
这个结构便于组织任务,并支持后续扩展,比如添加超时、重试机制或回调函数。
命令执行器实现
创建一个函数来执行单个任务,并输出结果:
立即学习“go语言免费学习笔记(深入)”;
func runTask(task CommandTask) error { fmt.Printf("正在执行任务: %s | 命令: %s %vn", task.Name, task.Cmd, task.Args)cmd := exec.Command(task.Cmd, task.Args...)cmd.Stdout = os.Stdout // 直接输出到标准输出cmd.Stderr = os.Stderrreturn cmd.Run()
}
该函数使用os/exec包运行命令,并将输出实时打印。可根据需求改为捕获输出(通过cmd.Output()或cmd.CombinedOutput())。
命令队列调度器
使用channel构建一个简单的任务队列,支持并发或串行执行:
func StartWorker(tasks <-chan CommandTask, concurrency int) { var wg sync.WaitGroupfor i := 0; i < concurrency; i++ { wg.Add(1) go func() { defer wg.Done() for task := range tasks { if err := runTask(task); err != nil { fmt.Printf("任务失败 [%s]: %vn", task.Name, err) } } }()}wg.Wait()
}
上述代码启动指定数量的worker从任务通道中读取并执行命令。设置concurrency=1即为串行执行;大于1则为并发执行。
使用示例:构建任务并提交队列
下面是如何组装任务并提交到队列的完整例子:
func main() { taskQueue := make(chan CommandTask, 10) // 缓冲通道作为队列// 示例任务列表tasks := []CommandTask{ { Name: "列出当前目录", Cmd: "ls", Args: []string{"-lah"}, }, { Name: "打印Go版本", Cmd: "go", Args: []string{"version"}, }, { Name: "显示工作路径", Cmd: "pwd", Args: nil, },}// 异步启动workergo func() { StartWorker(taskQueue, 1) // 串行执行}()// 提交任务for _, t := range tasks { taskQueue <- t}close(taskQueue)// 等待完成(可通过sync.WaitGroup更精确控制)time.Sleep(time.Second)
}
这段代码创建了一个缓冲通道作为任务队列,使用单个worker串行执行任务。你可以根据需要调整并发度。
基本上就这些。通过组合exec.Command与channel、goroutine,可以轻松实现灵活的命令队列系统,适合集成进CLI工具或自动化流程中。不复杂但容易忽略的是错误处理和资源释放,建议在生产环境中加入超时控制(context.WithTimeout)和日志记录。
以上就是Golang Command命令队列与任务模式示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410844.html
微信扫一扫
支付宝扫一扫