채널 준비를 통한 비동기 통신
Go에서 채널은 고루틴 간의 동시 통신을 촉진합니다. 버퍼링된 송신 채널과 버퍼링되지 않은 수신 채널을 처리할 때 두 채널을 동시에 선택하여 통신 흐름을 최적화할 수 있습니다. 이 문서에서는 CPU 사용률을 최소화하면서 이 기능을 구현하는 접근 방식을 살펴봅니다.
문제를 이해하려면 다음 맥락을 고려하십시오.
<code class="go">s := make(chan<- int, 5) // Buffered send channel r := make(<-chan int) // Unbuffered receive channel</code>
두 가지 모두에서 선택할 수 있는지 여부에 대한 의문이 생깁니다. 데이터를 읽을 수 있을 때 r이 선택되고 채널이 꽉 차 있지 않으면 s가 선택되는 채널.
해결책
선택을 사용하여 이를 달성할 수 있습니다. 기본 사례가 있는 문입니다. 전송될 값은 select를 사용할 때 한 번만 평가되므로 두 채널이 모두 준비되지 않은 경우 값이 오래됩니다. 이를 방지하기 위해 두 채널 모두 준비되지 않은 경우 실행되는 기본 사례가 선택 문에 추가됩니다. 이 기본 경우 프로그램은 짧은 시간 동안 절전 모드로 전환되어 채널이 준비될 수 있도록 한 다음 업데이트된 값으로 다시 시도합니다.
<code class="go">s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Evaluated each time we try to send select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // If none are ready currently, we end up here time.Sleep(time.Millisecond * 1) } }</code>
경고
len(r) 또는 cap(s)을 사용하여 채널 준비 상태를 확인한 후 전송/수신하는 것은 확인과 전송/수신 시도 사이에 채널 상태가 변경될 수 있으므로 권장되지 않습니다.
위 내용은 CPU 사용률을 최소화하면서 Go에서 채널 준비를 갖춘 비동기 통신을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!