이동 채널 튜토리얼

이 튜토리얼에서,우리는 당신이 당신의 이동 기반 응용 프로그램 내에서 채널을 사용할 수있는 방법을 찾고있을 것입니다.

채널은 통신을 허용하는 이동 기반 응용 프로그램 내에서goroutines사이를 연결하는 파이프이며 이후 변수에서 값을 전달합니다.

그들은 믿을 수 없을만큼 편리하고 다른 프로그래밍 언어에 비해 최소한의 소란과 이동에 매우 높은 성능,높은 동시 응용 프로그램을 만드는 데 도움이 될 수 있습니다. 이것은 결코 우연이 아니 었습니다.언어를 설계 할 때 핵심 개발자들은 언어 내에서 동시성이 일등 시민이 되길 원했고 너무 멀리 가지 않고 개발자가 작업해야하는 자유를 허용하지 않고 가능한 한 간단하게 작업 할 수 있도록 결정했습니다.

동시 시스템을 쉽게 만들 수 있는 능력은 애초에 저를 그 언어로 이끌었습니다.

참고-고루틴에 대해 더 배우고 싶다면 고루틴에 대한 다른 튜토리얼을 살펴 보는 것이 좋습니다.

목표

이 튜토리얼이 끝날 때까지:

  • 채널
  • 뒤에 이론에 대 한 확실 한 이해 채널을 사용 하는 간단한 동시 이동 응용 프로그램을 만들 수 있습니다

전제 조건

이 자습서를 완료 하려면 다음 필수 조건을 충족 해야 합니다:

  • 당신은 당신의 컴퓨터에 설치 이동해야합니다.

비디오 자습서

원하는 경우,이 튜토리얼은 비디오 형식으로 사용할 수 있습니다.

이 이론

채널이라는 개념은 새로운 것이 아니다.

그러나 바둑의 개발자들은 프로그래머들이 더 낫고,더 정확하며,매우 동시적인 응용 프로그램을 만들 수 있도록 가능한 한 간단한 방식으로 이러한 개념을 제시하는 것을 그들의 사명으로 삼았다.

간단한 예

의 우리가 이동에서 작동하는 방법의 정말 간단한 예를 구축 할 수있는 방법을 보는 것으로 시작하자. 우리는 먼저 멀리 가서 임의의 임의의 값을 계산하고 호출 채널 변수에 다시 전달하는 함수를 만들 수 있습니다values:

메인.

여기서 일어난 일을 분석해 봅시다. 우리의main()함수에서 우리는values := make(chan int)라고 불렀습니다.이 호출은 새로운 채널을 효과적으로 생성하여 이후CalculateValue고 루틴 내에서 사용할 수 있습니다.

참고-values채널을 인스턴스화 할 때make을 사용했는데 사용하기 전에 채널을 만들어야합니다.

채널을 만든 후defer close(values)을 호출하여main()함수의 실행이 끝날 때까지 채널을 닫는 것을 방지했습니다. 이것은 우리가 우리자신다음에 정돈하는 것을 지키는 전형적으로 제일 연습이라고 사려된다.

defer에 대한 우리의 호출 후,우리는 우리의 단일 고 루틴을 킥오프로 이동:CalculateValue(values)우리의 새로 만든values채널에서 전달의 매개 변수. 우리의CalculateValue함수 내에서,우리는 1-10 사이의 단일 임의의 값을 계산,이 출력 한 다음 호출하여 우리의values채널에이 값을 보내values <- value.

main()함수로 다시 점프한 다음value := <-values을 호출하여values채널에서 값을 받습니다.

참고-이 프로그램을 실행할 때 즉시 종료되지 않는 방법에 주목하십시오. 채널로 전송 및 수신하는 행위가 차단되기 때문입니다. 우리의main()기능은 채널에서 값을 수신 할 때까지 차단합니다.

이 코드를 실행하면 출력이 다음과 같이 표시됩니다:

$ go run main.goGo Channel TutorialCalculated Random Value: {} 77

요약:

myChannel := make(chan int) – 유형 채널 인 마이 채널을 만듭니다.int

channel <- value – 채널에 값 보내기

value := <- channel – 채널

에서 값을 받습니다.

버퍼링되지 않은 채널

고루틴 내에서 전통적인channel을 사용하면 때때로 예상하지 못한 동작이 발생할 수 있습니다. 전통적인unbuffered채널에서는 한 고루틴이 이 채널로 값을 보낼 때마다 그 고루틴이 채널로부터 값이 수신될 때까지 차단됩니다.

실제 예에서 이것을 보자. 아래 코드를 살펴보면 이전에 가지고 있던 코드와 매우 유사합니다. 그러나CalculateValue()기능을 확장하여 무작위로 계산 된 값을 채널로 보낸 후fmt.Println을 수행했습니다.

main()함수에서go CalculateValue(valueChannel)에 두 번째 호출을 추가했으므로 이 채널에 2 개의 값이 매우 빠르게 전송될 것으로 예상해야 합니다.

메인.이동

그러나 이것을 실행하면 첫 번째 고 루틴의 최종 인쇄 문만 실제로 실행된다는 것을 알 수 있습니다:

go run main.goGo Channel TutorialCalculated Random Value: {} 1Calculated Random Value: {} 71Only Executes after another goroutine performs a receive on the channel

그 이유는 두 번째 루틴에서c <- value에 대한 호출이 차단되었고 이후main()함수는 두 번째goroutine이 자체 실행을 완료 할 기회를 얻기 전에 실행을 마칩니다.

버퍼링된 채널

이 차단 동작을 해결하는 방법은 버퍼링된 채널이라는 것을 사용하는 것입니다. 이러한 버퍼링 된 채널은 본질적으로 교차 고 루틴 통신에 사용할 수있는 주어진 크기의 큐입니다. 버퍼링되지 않은 채널이 아닌 버퍼링된 채널을 만들기 위해make명령에 용량 인수를 제공합니다:

bufferedChannel := make(chan int, 3)

이를 버퍼링된 채널로 변경하면 송신 작업c <- value이 고루틴 내에서만 차단됩니다.

버퍼링된 채널을 사용하도록 기존 프로그램을 수정하고 출력을 살펴보겠습니다. main()함수의 맨 아래에time.Sleep()에 대한 호출을 추가하여main()함수를 느리게 차단하여 고 루틴이 실행을 완료 할 수 있도록했습니다.

메인.이동

이제,우리가 이것을 실행할 때,우리는 두 번째 수신이 우리의main()함수에서 호출되지 않았다는 사실에 관계없이 두 번째 고 루틴이 실제로 실행을 계속한다는 것을 알아야한다. time.Sleep()덕분에 버퍼링되지 않은 채널과 차단 특성 및 버퍼링 된 채널과 비 차단(완전하지 않은 경우)특성의 차이를 명확하게 볼 수 있습니다.

Go Channel TutorialCalculated Random Value: {} 1Calculated Random Value: {} 77This executes regardless as the send is now non-blockingThis executes regardless as the send is now non-blocking

결론

그래서,이 상당히 긴 튜토리얼에서,우리는 이동 내에서 채널의 다양한에 대해 배울 수 있었다. 우리는 버퍼링 된 채널과 버퍼링되지 않은 채널의 차이점과 동시 이동 프로그램 내에서 이러한 채널을 어떻게 사용할 수 있는지 발견했습니다.

이 튜토리얼을 즐길 경우,나를 아래의 코멘트 섹션에 알려 주시기 바랍니다. 당신은 내가 더 나은 무엇을 할 수 있는지에 대한 어떤 제안이 있다면 나는 아래의 코멘트 섹션에서 그들을 듣고 싶어요!

추가 읽기

이 기사를 즐겼고 이동 중에 동시성 작업에 대해 더 알고 싶다면 동시성에 대한 다른 기사를 확인하는 것이 좋습니다:

  • 이동 뮤텍스 튜토리얼
  • 이동 고 루틴 튜토리얼
  • 이동 동기화.대기 그룹 자습서

답글 남기기

이메일 주소는 공개되지 않습니다.

Previous post 브런 즈윅 카운티 도서관 시스템
Next post 캐비닛을 페인트하거나 얼룩지게해야합니까? 각