>  기사  >  백엔드 개발  >  Go의 버퍼링된 채널 범위가 차단 중입니다.

Go의 버퍼링된 채널 범위가 차단 중입니다.

WBOY
WBOY앞으로
2024-02-09 09:42:30659검색

Go 中缓冲通道的范围是阻塞的

php editor Yuzai Go 언어에서 버퍼 채널은 강력하고 유연한 도구입니다. 버퍼링된 채널은 데이터 전송과 수신을 동기화하는 메커니즘을 제공하여 통신 속도와 순서를 제어할 수 있습니다. 해당 범위는 차단입니다. 즉, 채널이 가득 차거나 비어 있으면 충분한 공간이나 데이터를 사용할 수 있을 때까지 보내기 및 받기 작업이 차단됩니다. 이 메커니즘은 동시 프로그램에서 자원 경쟁과 교착 상태 문제를 효과적으로 방지하고 프로그램의 안정성과 성능을 향상시킬 수 있습니다. 버퍼 채널을 합리적으로 사용함으로써 개발자는 동시 프로그램의 실행 프로세스를 더 잘 제어하고 프로그램 효율성과 안정성을 향상시킬 수 있습니다.

질문내용

뇌에 문제가 있는게 확실한데 버퍼채널을 반복하다가 막혔습니다

으아악

출력

으아악

이는 2개의 소스가 채널을 가득 채운다는 것을 증명합니다(최대 용량). 내가 여기서 무엇을 놓치고 있는 걸까요? never called 음, 전화한 적 없어요.

편집

    results := []search.book{}
    resultsstream := make(chan []search.book, 2)
    defer close(resultsstream)

    // parallelize searches to optimize response time
    for _, src := range sources {
        go src.search(bookname, resultsstream)
    }

    counter := 0
    for sourceresults := range resultsstream {
        counter = counter + 1
        results = append(results, sourceresults...)

        fmt.println(counter)
    }

    fmt.println("never called")

Workaround

Loop for sourceResults := range resultsStream 채널이 닫힐 때까지 반복적으로 값을 받습니다. 송신자가 채널을 완료하고 닫으면 루프가 종료됩니다.

각 병렬 검색에 대해 새 채널을 생성할 수 있으며 모든 작업자 코루틴이 완료되면 채널을 닫을 수 있습니다. 이렇게 하면 수신자 루프가 종료됩니다(참고: 발신자가 알지 못하고 닫힌 채널로 전송하면 패닉이 발생하므로 수신자 측에서 채널을 닫지 마십시오).

위 내용은 Go의 버퍼링된 채널 범위가 차단 중입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제