golang线程安全的串行和并行命令调度器插件库command的使用

Golang线程安全的串行和并行命令调度器插件库command的使用

简介

Command是一个Go语言实现的命令模式库,提供了线程安全的串行和并行命令调度器功能。

安装

go get -u github.com/txgruppi/command

测试

go get -u -t github.com/txgruppi/command
cd $GOPATH/src/github.com/txgruppi/command
go test ./...

使用示例

基本命令实现

首先我们需要定义一个实现command.Command接口的结构体:

package main

import (
	"fmt"
	"github.com/txgruppi/command"
)

// MyCommand 自定义命令
type MyCommand struct {
	name string
}

// Execute 实现Command接口
func (c *MyCommand) Execute() error {
	fmt.Printf("Executing command: %s\n", c.name)
	return nil
}

func main() {
	cmd := &MyCommand{name: "test"}
	err := cmd.Execute()
	if err != nil {
		fmt.Printf("Error executing command: %v\n", err)
	}
}

串行调度器使用示例

package main

import (
	"fmt"
	"github.com/txgruppi/command"
)

// SerialCommand 示例命令
type SerialCommand struct {
	id int
}

func (c *SerialCommand) Execute() error {
	fmt.Printf("Serial command %d executed\n", c.id)
	return nil
}

func main() {
	// 创建串行调度器
	serialDispatcher := command.NewSerialDispatcher()

	// 添加命令到调度器
	for i := 0; i < 5; i++ {
		serialDispatcher.Add(&SerialCommand{id: i})
	}

	// 执行所有命令(串行)
	err := serialDispatcher.Dispatch()
	if err != nil {
		fmt.Printf("Error dispatching commands: %v\n", err)
	}
}

并行调度器使用示例

package main

import (
	"fmt"
	"github.com/txgruppi/command"
	"time"
)

// ParallelCommand 示例命令
type ParallelCommand struct {
	id int
}

func (c *ParallelCommand) Execute() error {
	time.Sleep(time.Duration(c.id) * time.Second)
	fmt.Printf("Parallel command %d executed\n", c.id)
	return nil
}

func main() {
	// 创建并行调度器
	parallelDispatcher := command.NewParallelDispatcher()

	// 添加命令到调度器
	for i := 0; i < 5; i++ {
		parallelDispatcher.Add(&ParallelCommand{id: i})
	}

	// 执行所有命令(并行)
	err := parallelDispatcher.Dispatch()
	if err != nil {
		fmt.Printf("Error dispatching commands: %v\n", err)
	}
}

混合使用串行和并行调度器

package main

import (
	"fmt"
	"github.com/txgruppi/command"
)

// MixedCommand 示例命令
type MixedCommand struct {
	name string
}

func (c *MixedCommand) Execute() error {
	fmt.Printf("Executing: %s\n", c.name)
	return nil
}

func main() {
	// 创建主调度器(串行)
	mainDispatcher := command.NewSerialDispatcher()

	// 创建并行子调度器
	parallelDispatcher := command.NewParallelDispatcher()
	parallelDispatcher.Add(&MixedCommand{name: "Parallel 1"})
	parallelDispatcher.Add(&MixedCommand{name: "Parallel 2"})

	// 将并行调度器作为命令添加到主调度器
	mainDispatcher.Add(parallelDispatcher)
	
	// 添加串行命令
	mainDispatcher.Add(&MixedCommand{name: "Serial 1"})
	mainDispatcher.Add(&MixedCommand{name: "Serial 2"})

	// 执行调度
	err := mainDispatcher.Dispatch()
	if err != nil {
		fmt.Printf("Error dispatching commands: %v\n", err)
	}
}

错误处理

package main

import (
	"errors"
	"fmt"
	"github.com/txgruppi/command"
)

// ErrorCommand 会返回错误的命令
type ErrorCommand struct{}

func (c *ErrorCommand) Execute() error {
	return errors.New("example error")
}

func main() {
	dispatcher := command.NewSerialDispatcher()
	dispatcher.Add(&ErrorCommand{})

	err := dispatcher.Dispatch()
	if err != nil {
		fmt.Printf("Received error: %v\n", err)
	}
}

许可证

MIT


更多关于golang线程安全的串行和并行命令调度器插件库command的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang线程安全的串行和并行命令调度器插件库command的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang线程安全的串行和并行命令调度器插件库command使用指南

概述

Go语言的command库是一个用于管理命令执行的工具,支持串行和并行执行模式,并且是线程安全的。下面我将详细介绍如何使用这个库。

安装

首先安装command库:

go get github.com/go-command/command

基本使用

1. 创建命令

package main

import (
	"fmt"
	"time"
	
	"github.com/go-command/command"
)

func main() {
	// 创建命令1
	cmd1 := command.NewCommand("echo", "hello world")
	
	// 创建命令2
	cmd2 := command.NewCommand("sleep", "1")
	
	// 创建命令3
	cmd3 := command.NewCommand("date")
}

2. 串行执行

func serialExecution() {
	// 创建串行调度器
	serial := command.NewSerial()
	
	// 添加命令
	serial.Add(cmd1, cmd2, cmd3)
	
	// 执行命令
	if err := serial.Run(); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	
	// 获取执行结果
	for _, cmd := range serial.Commands() {
		fmt.Printf("Command: %s, ExitCode: %d\n", 
			cmd.GetName(), cmd.ProcessState.ExitCode())
	}
}

3. 并行执行

func parallelExecution() {
	// 创建并行调度器
	parallel := command.NewParallel()
	
	// 添加命令
	parallel.Add(cmd1, cmd2, cmd3)
	
	// 执行命令
	if err := parallel.Run(); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	
	// 获取执行结果
	for _, cmd := range parallel.Commands() {
		fmt.Printf("Command: %s, ExitCode: %d\n", 
			cmd.GetName(), cmd.ProcessState.ExitCode())
	}
}

高级功能

1. 设置超时

func withTimeout() {
	cmd := command.NewCommand("sleep", "5")
	
	// 设置3秒超时
	cmd.SetTimeout(3 * time.Second)
	
	serial := command.NewSerial()
	serial.Add(cmd)
	
	if err := serial.Run(); err != nil {
		fmt.Printf("Command timed out: %v\n", err)
	}
}

2. 获取输出

func captureOutput() {
	cmd := command.NewCommand("echo", "hello")
	
	// 捕获输出
	var out []byte
	cmd.OnOutput = func(output []byte) {
		out = append(out, output...)
	}
	
	serial := command.NewSerial()
	serial.Add(cmd)
	serial.Run()
	
	fmt.Printf("Command output: %s\n", string(out))
}

3. 自定义工作目录

func withWorkingDir() {
	cmd := command.NewCommand("ls")
	
	// 设置工作目录
	cmd.SetDir("/tmp")
	
	serial := command.NewSerial()
	serial.Add(cmd)
	serial.Run()
}

线程安全示例

func concurrentUsage() {
	// 创建并行调度器
	parallel := command.NewParallel()
	
	// 启动多个goroutine添加命令
	for i := 0; i < 10; i++ {
		go func(i int) {
			cmd := command.NewCommand("echo", fmt.Sprintf("task %d", i))
			parallel.Add(cmd)
		}(i)
	}
	
	// 等待所有goroutine完成添加
	time.Sleep(1 * time.Second)
	
	// 执行所有命令
	if err := parallel.Run(); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	
	// 输出结果
	for _, cmd := range parallel.Commands() {
		fmt.Printf("%s finished with code %d\n", 
			cmd.GetName(), cmd.ProcessState.ExitCode())
	}
}

错误处理

func errorHandling() {
	// 创建不存在的命令
	cmd := command.NewCommand("nonexistent-command")
	
	serial := command.NewSerial()
	serial.Add(cmd)
	
	if err := serial.Run(); err != nil {
		if exitErr, ok := err.(*exec.ExitError); ok {
			fmt.Printf("Command exited with code %d\n", exitErr.ExitCode())
		} else {
			fmt.Printf("Failed to start command: %v\n", err)
		}
	}
}

总结

  1. command库提供了简单易用的API来管理命令执行
  2. 支持串行和并行两种执行模式
  3. 线程安全,适合并发场景
  4. 提供超时控制、输出捕获等高级功能
  5. 良好的错误处理机制

这个库非常适合需要管理系统命令执行的场景,特别是在需要控制执行顺序或并行度的自动化任务中。

回到顶部