고루틴의 결과를 슬라이스로 수집할 때 교착 상태를 피하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-12 05:59:01
원래의
474명이 탐색했습니다.

How to Avoid Deadlock When Gathering Results from Goroutines into a Slice?

고루틴의 결과를 슬라이스로 수집

고루틴을 활용하여 데이터를 동시에 처리하고 결과를 수집하는 것은 어려울 수 있으며, 특히 동시성과 스레드를 관리할 때 더욱 그렇습니다. 안전. 결과를 수집하기 전에 모든 고루틴이 완료될 때까지 기다리도록 대기 그룹에 신호를 보내 코드에서 교착 상태 오류가 발생했습니다.

이 문제를 해결하려면 모든 고루틴이 완료된 후 결과 채널을 비동기적으로 닫아야 합니다. 그들의 임무. 코드의 수정된 버전은 다음과 같습니다.

for i, line := range contents {
    wg.Add(1)
    go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg)
}

go func() {
    wg.Wait()
    close(sampleChan)
}()

for s := range sampleChan {
    // Process results
}
로그인 후 복사

이 변경으로 인해 모든 고루틴이 완료되면 결과 채널이 닫혀서 결과를 올바르게 수집할 수 있습니다.

또한 향상된 코드 명확성과 테스트 용이성을 위해 newSample을 대기 그룹 및 채널을 사용하는 대신 결과를 생성하는 동기 함수로 리팩터링하는 것이 좋습니다. 이를 통해 동시성 문제를 더 명확하게 분리하고 테스트를 더 쉽게 할 수 있습니다.

이러한 조정을 구현하면 고루틴에서 효율적으로 결과를 수집하고 교착 상태 오류를 방지할 수 있습니다.

위 내용은 고루틴의 결과를 슬라이스로 수집할 때 교착 상태를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿