동일한 채널에서 여러 고루틴을 읽는 중

王林
풀어 주다: 2024-02-09 16:30:10
앞으로
374명이 탐색했습니다.

多个 goroutine 从同一通道读取

php editor Strawberry는 이 글에서 동일한 채널에서 읽는 여러 고루틴의 관련 콘텐츠를 소개합니다. 동시 프로그래밍에서 고루틴은 동시에 여러 작업을 수행할 수 있는 Go 언어의 경량 스레드입니다. 채널은 고루틴 간 통신을 위한 중요한 방법입니다. 여러 고루틴이 동일한 채널에서 데이터를 읽어야 하는 경우 몇 가지 문제에 주의를 기울이고 프로그램의 정확성과 효율성을 보장하기 위해 해당 조치를 취해야 합니다. 다음에서는 프로세스를 자세히 설명하고 몇 가지 실용적인 팁과 조언을 제공하겠습니다.

질문 내용

동일한 채널에서 값을 읽으려면 여러 개의 고루틴을 생성하는 것을 고려해보세요. 두 작업자가 예상대로 생성되었지만 채널에서 항목 하나만 읽고 읽기를 중지합니다. 채널에 값을 보내는 고루틴이 닫힐 때까지 고루틴이 채널에서 데이터를 계속 읽을 것으로 예상합니다. 발신자가 보내는 것을 방해하는 문제가 있더라도 프로젝트를 생성한 고루틴은 닫히지 않습니다. 각 작업자가 하나의 값만 읽고 중지하는 이유는 무엇입니까?

출력에는 각 작업자 고루틴에서 읽은 두 개의 값이 표시됩니다. 세 번째 값은 전송되지만 두 작업자 스레드 모두에서 읽히지는 않습니다.

으아악

놀이터로 가기

new worker new worker waiting sending 0 sending 1 sending 2 running func 1 sending value out 1 running func 0 sending value out 0
로그인 후 복사

해결 방법

채널이 버퍼링되지 않는다는 이전 설명은 정확하지만 다른 동기화 문제가 있습니다.

버퍼링되지 않은 채널은 본질적으로 값이 기록될 때 다른 쓰기가 발생하기 전에 해당 값을 수신해야 함을 의미합니다.

  1. workerpool创建一个无缓冲通道out来存储结果,但只有在所有结果写入 out 后才返回。但由于从 out 通道的读取发生在out返回之后,并且out没有缓冲,因此workerpool在尝试写入时被阻塞,从而导致死锁。这就是为什么看起来每个工作人员只发送一个值;实际上,在发送第一个之后,所有工作人员都被阻止,因为没有任何东西可以接收该值(您可以通过在写入out이것을 보려면 print 문을 뒤로 이동하세요)

수정 옵션에는out有一个大小为n = 结果数的缓冲区(即out := make(chan int, n))或使out不缓冲并在写入时从out읽기를 수행하는 것이 포함됩니다.

  1. done频道也没有被正确使用。mainworkerpool둘 다 실행을 중지하기 위해 이에 의존하지만 아무 것도 기록되지 않습니다! 또한 버퍼링되지 않으므로 위에서 언급한 교착 상태 문제가 발생합니다.

이 문제를 해결하려면 먼저 버퍼링된 채널 설정에서workerpool中删除case <-done:并简单地通过in进行范围,因为它在main中关闭。然后可以将done교착 상태를 해결하면 됩니다.

다음 수정 사항을 결합하여 다음을 얻을 수 있습니다.

으아악

이 방법으로 문제를 해결할 수는 있지만 채널을 사용하는 가장 좋은 방법은 아닙니다! 버퍼링된 채널에 의존하지 않고도 구조 자체를 더 간단하게 변경할 수 있습니다.

위 내용은 동일한 채널에서 여러 고루틴을 읽는 중의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!