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
채널이 버퍼링되지 않는다는 이전 설명은 정확하지만 다른 동기화 문제가 있습니다.
버퍼링되지 않은 채널은 본질적으로 값이 기록될 때 다른 쓰기가 발생하기 전에 해당 값을 수신해야 함을 의미합니다.
workerpool
创建一个无缓冲通道 out
来存储结果,但只有在所有结果写入 out 后才返回。但由于从 out 通道的读取发生在 out
返回之后,并且 out
没有缓冲,因此 workerpool
在尝试写入时被阻塞,从而导致死锁。这就是为什么看起来每个工作人员只发送一个值;实际上,在发送第一个之后,所有工作人员都被阻止,因为没有任何东西可以接收该值(您可以通过在写入 out
이것을 보려면 print 문을 뒤로 이동하세요)수정 옵션에는 out
有一个大小为 n = 结果数
的缓冲区(即 out := make(chan int, n)
)或使 out
不缓冲并在写入时从 out
읽기를 수행하는 것이 포함됩니다.
done
频道也没有被正确使用。 main
和 workerpool
둘 다 실행을 중지하기 위해 이에 의존하지만 아무 것도 기록되지 않습니다! 또한 버퍼링되지 않으므로 위에서 언급한 교착 상태 문제가 발생합니다. 이 문제를 해결하려면 먼저 버퍼링된 채널 설정에서 workerpool
中删除 case <-done:
并简单地通过 in
进行范围,因为它在 main
中关闭。然后可以将done
교착 상태를 해결하면 됩니다.
다음 수정 사항을 결합하여 다음을 얻을 수 있습니다.
으아악이 방법으로 문제를 해결할 수는 있지만 채널을 사용하는 가장 좋은 방법은 아닙니다! 버퍼링된 채널에 의존하지 않고도 구조 자체를 더 간단하게 변경할 수 있습니다.
위 내용은 동일한 채널에서 여러 고루틴을 읽는 중의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!