> 일반적인 문제 > Go 언어로 된 채널 관련 설명

Go 언어로 된 채널 관련 설명

little bottle
풀어 주다: 2019-04-09 11:41:12
앞으로
3087명이 탐색했습니다.

CSP 모델은 Go 언어에서 스레드 통신을 위해 사용됩니다. 정확하게 말하면 경량 스레드 고루틴 간의 통신입니다. CSP 모델은 행위자 모델과 유사하며 동시에 실행되는 독립 엔터티로 구성됩니다. 또한 엔터티는 메시지를 보내 통신합니다.

1. Actor 모델과 CSP 모델의 차이점:

Actors는 직접 통신하는 반면 CSP는 결합 정도 측면에서 차이가 있습니다.
CSP 모델의 주요 차이점은 메시지의 발신자와 수신자가 채널을 통해 느슨하게 결합되어 있다는 것입니다. 발신자는 어떤 수신자가 메시지를 소비했는지 알 수 없고, 수신자는 어떤 발신자가 메시지를 보냈는지 알 수 없습니다. Actor 모델에서는 Actor가 자신의 상태에 따라 처리할 수신 메시지를 선택할 수 있으므로 자율성과 제어 가능성이 더 좋습니다.
Go 언어의 프로세스를 차단하지 않으려면 프로그래머는 올바른 순서를 예측하고 보장하기 위해 들어오는 다양한 메시지를 확인해야 합니다. CSP의 장점은 채널이 메시지를 버퍼링할 필요가 없는 반면 Actor는 이론적으로 메시지 버퍼로 무제한 크기의 사서함이 필요하다는 것입니다.
CSP 모델의 메시지 발신자는 수신자가 메시지를 받을 준비가 된 경우에만 메시지를 보낼 수 있습니다. 반면에 행위자 모델의 메시지 전달은 비동기식입니다. 즉, 메시지 보내기와 받기가 동시에 발생할 필요가 없으며, 받는 사람이 메시지를 받을 준비가 되기 전에 보낸 사람이 메시지를 보낼 수 있습니다.

2. Go 채널에 대한 자세한 설명
채널 유형의 정의 형식은 다음과 같습니다.

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
로그인 후 복사

3가지 유형의 정의가 포함되어 있습니다. 선택적인 <-는 채널의 방향을 나타냅니다. 방향이 지정되지 않은 경우 채널은 양방향이며 데이터를 수신하고 데이터를 보낼 수 있습니다.

chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据
로그인 후 복사

<-항상 가장 왼쪽 유형부터 먼저 결합하세요. (<- 연산자는 가장 왼쪽 chan과 연결 가능)

c := make(chan bool) //创建一个无缓冲的bool型Channel
c <- x        //向一个Channel发送一个值
<- c          //从一个Channel中接收一个值
x = <- c      //从Channel c接收一个值并将其存储到x中
x, ok = <- c  //从Channel接收一个值,如果channel关闭了或没有数据,那么ok将被置为false
로그인 후 복사

기본적으로 채널 발신자와 수신자는 상대방이 전송 또는 수신할 준비가 될 때까지 차단하므로 잠금이나 다른 조건 없이 Go 언어가 자연스럽게 동시성이 발생합니다. 지원됩니다.
make를 사용하여 채널을 초기화하고 용량을 설정할 수 있습니다.

make(chan int, 100) #//创建一个有缓冲的int型Channel
로그인 후 복사

Capacity(용량)는 채널이 수용할 수 있는 최대 요소 수를 나타내며 채널 캐시의 크기를 나타냅니다.
용량이 설정되지 않거나, 용량이 0으로 설정되면 채널에 캐시가 없다는 의미입니다.
추가 동기화 조치를 고려할 필요 없이 여러 고루틴의 채널과 데이터를 주고받을 수 있습니다.
채널은 FIFO(선입선출) 대기열로 사용할 수 있으며, 수신된 데이터와 전송된 데이터의 순서가 일관됩니다.
버퍼링이 없는 채널은 통신과 동기화 특성을 모두 갖고 있어 동시 개발에 매우 ​​인기가 높습니다.

// _Channels_ are the pipes that connect concurrent
// goroutines. You can send values into channels from one
// goroutine and receive those values into another
// goroutine.

package main

import "fmt"

func main() {

    // Create a new channel with `make(chan val-type)`.
    // Channels are typed by the values they convey.
    messages := make(chan string)

    // _Send_ a value into a channel using the `channel <-`
    // syntax. Here we send `"ping"`  to the `messages`
    // channel we made above, from a new goroutine.
    go func() { messages <- "ping" }()

    // The `<-channel` syntax _receives_ a value from the
    // channel. Here we&#39;ll receive the `"ping"` message
    // we sent above and print it out.
    msg := <-messages
    fmt.Println(msg)
}
로그인 후 복사

여기서 버퍼링되지 않은 문자열 유형 채널을 만든 다음 고루틴에서 채널<-를 사용하여 이 채널에 "ping"을 전달합니다. <-채널은 이 값을 수신하고 이를 주 함수에 인쇄합니다. 실제로 여기서는 채널을 사용하여 "ping" 메시지를 고루틴에서 기본 고루틴으로 조용히 전송하여 스레드 간(정확하게는 고루틴 간) 통신을 실현합니다.
채널 발신자와 수신자는 상대방이 전송 또는 수신할 준비가 될 때까지 차단하기 때문에 다른 동기화 작업 없이 프로그램 종료 시 "핑" 메시지를 기다릴 수 있습니다. ㅋㅋㅋ语言中使用了CSP模型来进行线程信,准确说,是轻weight级스레드 고루틴 간의 통신. CSP 모델은 행위자 모델과 유사하며 동시에 실행되는 독립 엔터티로 구성됩니다. 또한 엔터티는 메시지를 보내 통신합니다.

【추천 코스:

Go 동영상 튜토리얼

위 내용은 Go 언어로 된 채널 관련 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿