首先定义命令任务结构体,再实现执行函数和基于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 %v\n", task.Name, task.Cmd, task.Args)
<pre class='brush:php;toolbar:false;'>cmd := exec.Command(task.Cmd, task.Args...)
cmd.Stdout = os.Stdout // 直接输出到标准输出
cmd.Stderr = os.Stderr
return cmd.Run()}
该函数使用os/exec包运行命令,并将输出实时打印。可根据需求改为捕获输出(通过cmd.Output()或cmd.CombinedOutput())。
使用channel构建一个简单的任务队列,支持并发或串行执行:
func StartWorker(tasks <-chan CommandTask, concurrency int) {
var wg sync.WaitGroup
<pre class='brush:php;toolbar:false;'>for 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]: %v\n", task.Name, err)
}
}
}()
}
wg.Wait()}
上述代码启动指定数量的worker从任务通道中读取并执行命令。设置concurrency=1即为串行执行;大于1则为并发执行。
下面是如何组装任务并提交到队列的完整例子:
func main() {
taskQueue := make(chan CommandTask, 10) // 缓冲通道作为队列
<pre class='brush:php;toolbar:false;'>// 示例任务列表
tasks := []CommandTask{
{
Name: "列出当前目录",
Cmd: "ls",
Args: []string{"-lah"},
},
{
Name: "打印Go版本",
Cmd: "go",
Args: []string{"version"},
},
{
Name: "显示工作路径",
Cmd: "pwd",
Args: nil,
},
}
// 异步启动worker
go 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命令队列与任务模式示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号