>  기사  >  백엔드 개발  >  Go 채널의 버퍼 제한이 올바르게 쓰기/읽기되지 않는 이유는 무엇입니까?

Go 채널의 버퍼 제한이 올바르게 쓰기/읽기되지 않는 이유는 무엇입니까?

WBOY
WBOY앞으로
2024-02-09 10:30:19423검색

为什么Go Channel的缓冲区不能正确限制写入/读取?

php 편집자 Youzi는 이 기사에서 "Go 채널의 버퍼가 쓰기/읽기를 올바르게 제한하지 않는 이유는 무엇입니까?"라는 일반적인 질문에 답할 것입니다. Go 언어에서 채널은 코루틴 통신 메커니즘에 사용되는 방법입니다. 버퍼와 함께 채널을 사용할 때 쓰기 또는 읽기 작업 수를 제한하여 프로그램의 동작을 제어할 수 있을 것으로 기대합니다. 그러나 실제로 채널 버퍼는 쓰기/읽기 작업 수를 직접 제한할 수 없습니다. 이 문제의 원인과 해결 방법은 아래에서 자세히 설명하겠습니다.

질문내용

채널을 이용하여 두 바둑루틴간 소통을 하려고 합니다. 먼저 정수 채널을 만든 다음 이를 0부터 10까지의 일련의 숫자를 인쇄하는 go 루틴에 매개변수로 전달했습니다. 이러한 프로그램의 출력은 의미가 없습니다.

주 코드는 다음과 같습니다:

으아악

이 코드 실행에서 다음과 같은 결과가 나왔습니다.

으아악

두 번의 쓰기 실행과 두 번의 읽기 실행이 있다는 점에 유의하세요.

나중에 다음 기능을 달성하기 위해 버퍼 크기를 설정했습니다.

으아악

그러면 다음과 같은 결과가 나옵니다:

으아악

이제 5번의 쓰기 실행과 5번의 읽기 실행이 이루어졌습니다.

코드와 출력이 확보되면 마지막 질문이 생깁니다. 이러한 실행이 왜 그렇게 작동하는 걸까요? 첫째, 한 번에 하나의 숫자만 읽고 써야 하는 것 아닌가요? 게다가 두 번째 실행에서 매번 3개가 아닌 5개의 숫자를 읽고 쓰는 이유는 무엇입니까(버퍼 크기이기 때문에)?

해결 방법

메시지를 인쇄할 때와 채널에서 숫자를 읽거나 쓸 때 혼란스러워집니다.

쓰기가 발생하면 "쓰기" 메시지가 발생하지 않습니다. 쓰기 사이의 어느 시점에서 발생합니다. 마찬가지로 "읽기" 메시지는 읽기 사이의 특정 지점에서 발생합니다.

다음은 표시된 출력을 생성하는 첫 번째 코드 조각을 배열하는 한 가지 방법입니다.

  • 주로 읽어보고 차단하세요.
  • 스태프는 "Writing 0"을 인쇄합니다.
  • Worker는 0을 쓰고 메인을 읽습니다.
  • 직원이 "Writing 1"을 인쇄합니다.
  • 작업 스레드가 1을 쓰려고 했지만 차단되었습니다.
  • 주로 "Reading 0"을 인쇄합니다.
  • 주요 내용은 1입니다.
  • 본판 "읽기 1".
  • 주로 읽어보고 차단하세요.

컨트롤은 이렇게 메인과 워커 사이에 지속적으로 전달되며, 각각은 차단되기 전에 2개의 메시지를 인쇄합니다.

마찬가지로 두 번째 클립은 다음과 같이 정리할 수 있습니다:

  • 주로 읽어보고 차단하세요.
  • Worker는 "Writing 0"을 인쇄하고 0을 메인으로 직접 보냅니다.
  • Worker는 "Writing 1"을 인쇄하고 1을 버퍼링합니다.
  • Worker는 "Writing 2"를 인쇄하고 2를 버퍼링합니다.
  • Worker는 "Writing 3"을 인쇄하고 3을 버퍼링합니다.
  • 작업 스레드는 "Writing 4"를 인쇄하고 4를 보내려는 시도를 차단합니다.
  • main은 차단된 읽기를 완료하고 "Reading 0"을 인쇄합니다.
  • main은 버퍼링된 1을 읽고 "Reading 1"을 인쇄합니다.
  • main은 버퍼링된 2를 읽고 "Reading 2"를 인쇄합니다.
  • main은 버퍼링된 3을 읽고 "Reading 3"을 인쇄합니다.
  • main은 차단된 Worker 4를 읽고 "Reading 4"를 인쇄합니다.
  • 주로 읽어보고 차단하세요.
  • 실행이 Worker로 반환됩니다...

위 내용은 Go 채널의 버퍼 제한이 올바르게 쓰기/읽기되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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