Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 使用带有时间和超时的作业_Go - Fatal编程技术网

Go 使用带有时间和超时的作业

Go 使用带有时间和超时的作业,go,Go,我使用下面的示例代码,现在我希望每个作业都能够 打印执行所需的时间(最好是通用的,不是每个作业都需要使用 start:=time.Now() 花费:=时间。自(开始)。毫秒() 并提供作业的超时时间,例如,如果杀死或停止作业需要10秒以上的时间 主程序包 进口( “编码/json” “fmt” “github.com/gammazero/workerpool” ) 变量numWorkers=10 类型MyReturnType结构{ 名称字符串 数据接口{} } func wrapJob(rc

我使用下面的示例代码,现在我希望每个作业都能够 打印执行所需的时间(最好是通用的,不是每个作业都需要使用

start:=time.Now()
花费:=时间。自(开始)。毫秒()
并提供作业的超时时间,例如,如果杀死或停止作业需要10秒以上的时间

主程序包
进口(
“编码/json”
“fmt”
“github.com/gammazero/workerpool”
)
变量numWorkers=10
类型MyReturnType结构{
名称字符串
数据接口{}
}
func wrapJob(rc chan MyReturnType,f func()MyReturnType)func(){
返回func(){
rc更新
滚动至“这是已接受的答案”部分以查看已接受的答案

我继续写了一个小库从代码在接受的答案

或以下代码:

//如何使用库
包干管
进口(
“fmt”
“时间”
“github.com/oze4/reactor”
)
func main(){
timeoutForJobs:=时间.持续时间(时间.秒*10)
工人数量:=10
myreactor:=reactor.New(numOfWorkers,timeoutForJobs)
//您还可以使用自定义客户端创建反应器
//myreactor:=reactor.NewWithClient(numOfWorkers、timeoutForJobs和reactor.Client{…})
//添加作业
myreactor.Add(reactor.Job{
名称:“job1”,
运行程序:func(c*reactor.Client)reactor.React{
//对客户机c做些什么`
res,z:=c.HTTP.Get(“xyz.com”)
返回反应器。反应{Info:res}
},
})
//所有结果都会在这里
结果:=myreactor.GetResults()
对于_,结果:=范围结果{
fmt.Println(结果)
}
}
图书馆代码
//库代码
包装反应器
进口(
“上下文”
“net/http”
“时间”
“github.com/gammazero/workerpool”
“k8s.io/client go/kubernetes”
)
//新的创造了一个新的反应堆
func New(maxWorkers int,jobTimeout time.Duration)反应器{
//在此处执行任何需要的操作以创建默认客户端
默认客户端:=&客户端{
HTTP:HTTP.Client{},
Kubernetes:Kubernetes.Clientset{},
}
回流反应器{
workerPool:workerPool.New(maxWorkers),
jobTimeout:jobTimeout,
传输:默认客户端,
结果:制造(chan React,100),
}
}
//NewWithClient使用自定义客户端创建新的反应器
func NewWithClient(客户端*client,maxWorkers int,jobTimeout time.Duration)反应器{
回流反应器{
workerPool:workerPool.New(maxWorkers),
jobTimeout:jobTimeout,
运输:客户,
结果:制造(chan React,100),
}
}
//反应堆知道如何处理工作
类型反应堆接口{
Add(j Job)//Add将作业放入队列
Client()*Client//我不知道您是否希望消费者能够访问此文件
GetResults()[]反应//获取结果
Timeout()time.Duration//我不知道您是否希望消费者能够访问此文件
WorkerPool()*WorkerPool.WorkerPool//我不知道您是否希望消费者能够访问此文件
}
型反应堆结构{
作业超时时间。持续时间
workerPool*workerPool.workerPool
结果陈灿反应良好
传输*客户端
}
//添加提交作业
func(r*反应器)添加(j作业){
r、 workerPool.Submit(r.wrapper(j))
}
//我不知道您是否希望消费者能够访问此功能
func(r*反应器)客户端()*客户端{
返回r.运输
}
//得到结果得到结果
func(r*反应器)GetResults()[]反应{
返回r.getResults()
}
func(r*反应器)getResults()[]反应{
r、 workerPool.StopWait()
关闭(r.resultsChan)
var allReacts[]React
对于jobreact:=范围r.resultsChan{
allReacts=append(allReacts,jobreact)
}
返回所有反应
}
func(r*反应器)超时()时间。持续时间{
返回r.jobTimeout
}
//我不知道您是否希望消费者能够访问此功能
func(r*反应器)WorkerPool()*WorkerPool.WorkerPool{
返回r.workerPool
}
//工人应该是私人的
func(r*reactor)worker(ctx context.context,done context.CancelFunc,job job,start time.time){
runner:=作业。runner(r.transport)
runner.duration=时间.自(开始)
runner.name=job.name
如果ctx.Err()==nil{

r、 resultsChan您有什么问题?对于超时和取消,请使用。@Peter-好的,我会检查它,但对于打印时间,请在wrapJob返回的匿名函数中查看我的updatePrint。@Peter-您的意思是类似“return func(){start:=time.Now()”的内容吗rc是。假设您想包括等待接收者的潜在时间。谢谢1+!如果不是太复杂,如果您可以添加取消的示例,那就太好了。谢谢,switch fork`case context.cancelled://success}`>?我不确定我是否理解…没有任何东西可以实际删除该案例。好的,谢谢。我正在检查它。所以它应该是
如果
,对吗?或者应该使用开关?需要使用开关。请参阅我的更新。我试着清理了一些。