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)
}
}
}
总结
command
库提供了简单易用的API来管理命令执行- 支持串行和并行两种执行模式
- 线程安全,适合并发场景
- 提供超时控制、输出捕获等高级功能
- 良好的错误处理机制
这个库非常适合需要管理系统命令执行的场景,特别是在需要控制执行顺序或并行度的自动化任务中。