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

Go 언어로 된 채널 관련 설명

Apr 09, 2019 am 11:41 AM
channel 언어로 가다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? Apr 02, 2025 pm 02:06 PM

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Apr 02, 2025 pm 02:09 PM

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? 이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? Apr 02, 2025 pm 02:03 PM

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? 골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Apr 02, 2025 pm 05:09 PM

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Apr 02, 2025 pm 04:54 PM

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? Apr 02, 2025 pm 04:12 PM

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? Apr 02, 2025 pm 12:57 PM

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

sql.open을 사용할 때 DSN이 비어있을 때 오류가 발생하지 않습니까? sql.open을 사용할 때 DSN이 비어있을 때 오류가 발생하지 않습니까? Apr 02, 2025 pm 12:54 PM

sql.open을 사용할 때 DSN에 오류가 발생하지 않는 이유는 무엇입니까? Go Language, SQL.open ...