我试图剥离一组goroutines,然后等待它们全部完成.
import "sync"
func doWork(wg sync.WaitGroup) error {
defer wg.Done()
// Do some heavy lifting... request URL's or similar
return nil
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go doWork(wg)
}
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我收到以下错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 16 [semacquire]:
sync.runtime_Semacquire(0xc20818c658)
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc2080544e0)
/usr/local/Cellar/go/1.3/libexec/src/pkg/sync/waitgroup.go:129 +0x14b
main.main()
/Users/kevin/code/vrusability/scripts/oculus_share_ratings.go:150 +0x398
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我写的几乎与文档示例演示的完全相同.
Kev*_*rke 10
您需要将指针传递给WaitGroup,而不是WaitGroup对象.当您传递实际的WaitGroup时,Go会复制该值,并调用Done()该副本.结果是原始WaitGroup将有十个Add并且没有Done,并且WaitGroup的每个副本将具有一个Done(),并且当WaitGroup传递给该函数时有许多Add.
改为传递指针,每个函数都将引用相同的WaitGroup.
import "sync"
func doWork(wg *sync.WaitGroup) error {
defer wg.Done()
// Do some heavy lifting... request URL's or similar
return nil
}
func main() {
wg := &sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go doWork(wg)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1270 次 |
| 最近记录: |