Goroutine 与 for 循环同时执行我的函数
Goroutine is taking same time to execute my function as for loop
我有一个创建 Istio VirtualService 对象的函数。
我正在使用 goroutines 并发执行我的功能,启动 100 个工人。
var data map[string]string
for _, data = range MapList {
wg.Add(1)
limit.Execute(func() {
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
})
wg.Wait()
}
如果我只是循环遍历 seMapList 并执行我的函数,这需要完全相同的时间来执行。
为什么?
因为您正在等待 goroutine 在启动后立即完成。试试这个:
for _, data = range MapList {
wg.Add(1)
limit.Execute(func() {
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
})
}
wg.Wait() // Wait for them after all goroutines are created
@Burak Serdan 的回答是正确的,但在这种情况下可能不是。据我所知,您将匿名函数传递给 limit.Execute
,因此您的匿名函数将真正启动新的 goroutine,但不会立即启动,但在 limit.Execute
之后将在内部某处调用此匿名函数。
但是你可以传递一个函数,而不是传递 N 个匿名函数,然后这个函数将运行 N 个 goroutines
var data map[string]string
limit.Execute(func() {
for _, data = range MapList {
wg.Add(1)
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
}
})
wg.Wait()
我有一个创建 Istio VirtualService 对象的函数。 我正在使用 goroutines 并发执行我的功能,启动 100 个工人。
var data map[string]string
for _, data = range MapList {
wg.Add(1)
limit.Execute(func() {
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
})
wg.Wait()
}
如果我只是循环遍历 seMapList 并执行我的函数,这需要完全相同的时间来执行。
为什么?
因为您正在等待 goroutine 在启动后立即完成。试试这个:
for _, data = range MapList {
wg.Add(1)
limit.Execute(func() {
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
})
}
wg.Wait() // Wait for them after all goroutines are created
@Burak Serdan 的回答是正确的,但在这种情况下可能不是。据我所知,您将匿名函数传递给 limit.Execute
,因此您的匿名函数将真正启动新的 goroutine,但不会立即启动,但在 limit.Execute
之后将在内部某处调用此匿名函数。
但是你可以传递一个函数,而不是传递 N 个匿名函数,然后这个函数将运行 N 个 goroutines
var data map[string]string
limit.Execute(func() {
for _, data = range MapList {
wg.Add(1)
go func(data map[string]string) {
defer wg.Done()
_,_ = m.createVirtualServices(ctx, data, namespace)
}(data)
}
})
wg.Wait()