대기 그룹이 있음에도 불구하고 고루틴이 끝나지 않는 문제가 있습니다. 첨부된 코드에서 힙 순열 알고리즘의 구현을 볼 수 있습니다. 속도를 높이고 싶었기 때문에 가능한 첫 번째 숫자 각각에 대해 고루틴을 만들어서 각 고루틴의 순열을 (n-1)!
。总的来说,我应该仍然有 n!
排列 (n*(n-1)!= n!
),但我的主例程似乎在子例程完成之前退出。然后我尝试跟踪执行的排列。与我的信念相反,执行的排列数量不是恒定的,但在 n!
下总是有点(对于低 n
)或非常多(对于大 n
)으로 줄였습니다.
예를 들어 n=4
每次的排列都是 24,即 4!
,这样所有的 goroutine 就结束了。如果我有一个更高的数字,例如 n=8
,我会得到一个大约 13500
的值,而不是预期的 40000 = 8!
.
이런 행동은 어디서 오는 걸까요? 메인 프로그램이 종료되기 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?
으아아아(동일한 동작은 https://go.dev/play/에서 쉽게 달성할 수 있으므로 재현성이 매우 높습니다.)
귀하의 코드에서 고루틴은 permutations
变量。当您增加 n
값으로 동시에 액세스합니다. , 작업량이 증가하여 예상치 못한 결과를 초래하는 문제가 될 수 있습니다.
mutex
,它将确保当时只有一个goroutine可以访问permutations
를 사용할 수 있습니다.
위 내용은 WaitGroup이 있음에도 불구하고 고루틴이 중단된 것 같습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!