찾다
백엔드 개발GolangGolang 채널 구현에 대해

Golang 채널 구현에 대해

May 06, 2021 am 10:00 AM
golang

다음은 golang 튜토리얼 칼럼에서 Golang 채널 구현에 대한 소개입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

1. 소개

채널은 언어 수준에서 Go 언어가 제공하는 고루틴 간의 통신 방법입니다. 채널은 두 개 이상의 고루틴 간에 메시지를 전달하는 데 사용할 수 있습니다. 채널은 프로세스 내 통신 방법이므로 채널을 통해 객체를 전달하는 프로세스는 함수 호출 시 매개변수 전달 동작과 일치합니다. 예를 들어 포인터도 전달할 수 있습니다. 프로세스 간 통신이 필요한 경우 소켓이나 HTTP와 같은 통신 프로토콜을 사용하는 등 분산 시스템을 사용하여 문제를 해결하는 것이 좋습니다.

채널은 유형과 관련되어 있습니다. 즉, 채널은 한 가지 유형의 값만 전달할 수 있으며 채널을 선언할 때 이 유형을 지정해야 합니다. 채널 자체도 Go 언어의 기본 유형이며 지도와 같은 유형과 동일한 상태이므로 채널 자체도 정의된 후 채널을 통해 전달될 수 있습니다.

2. 기본 구현

2.1 hchan 구조

type hchan struct {
   qcount   uint           // 队列中当前数据的个数
   dataqsiz uint           // size of the circular queue
   buf      unsafe.Pointer // 数据缓冲区,存放数据的环形数组
   elemsize uint16 // channel中数据类型的大小(单个元素的大小)
   closed   uint32 // 表示channel是否关闭标识位
   elemtype *_type // 队列中的元素类型
   sendx    uint   // 当前发送元素的索引
   recvx    uint   // 当前接收元素的索引
   recvq    waitq  // 接受等待队列,由recv行为(也就是<-ch)阻塞在channel上的goroutine队列
   sendq    waitq  // 发送等待队列, 由send行为(也就是ch<-)阻塞在channel上的goroutine队列
   //lock保护chann中的所有字段,以及在此通道上阻塞的sudoG中的几个字段。
   //保持此锁时不要更改另一个G状态(特别是没准备好G),因为这可能会因堆栈收缩而死锁
   lock mutex
}

//发送及接收队列的·1结构体
type waitq struct {
    first *sudog
    last  *sudog
}
  • qcount uint // 현재 대기열에 남아 있는 요소 수입니다.
  • dataqsiz uint // 링 큐 길이, 즉 버퍼의 크기, 즉 make(chan T, N), N.
  • buf unsafe.Pointer // 링 큐 포인터.
  • elemsize uint16 // 각 요소의 크기입니다.
  • closed uint32 // 현재 채널이 닫혀 있는지 여부를 나타냅니다. 채널이 생성되면 이 필드는 0으로 설정됩니다. 즉, close를 호출하여 1로 설정하면 채널이 닫힙니다.
  • elemtype *_type // 데이터 전송 중 할당에 사용되는 요소 유형입니다.
  • sendx uint 및 recvx uint는 링 버퍼의 상태 필드로, 버퍼의 현재 인덱스를 나타내며 데이터를 보내고 받을 수 있는 배열을 지원합니다.
  • recvq waitq // 메시지 읽기를 기다리는 고루틴 큐.
  • sendq waitq // 메시지 쓰기를 기다리는 고루틴 큐.
  • lock mutex // 뮤텍스 잠금은 전송 및 수신이 상호 배타적인 작업이어야 하기 때문에 읽기 및 쓰기 작업마다 채널을 잠급니다.

2.2 생성 과정

2.2.1 쓰기 작업

1. 버퍼로 채널을 생성합니다

2. 채널에 데이터를 씁니다

3.3 항목 쓰기 프로세스는 다음과 같습니다.

  • 전체 파이프라인 구조를 잠급니다.
  • 쓰기를 확인하고 대기열에서 고루틴을 기다린 다음 요소를 고루틴에 직접 씁니다.
  • recvq가 비어 있으면 버퍼를 사용할 수 있는지 확인하세요. 가능한 경우 현재 고루틴의 데이터를 버퍼에 복사합니다.
  • 버퍼가 가득 차면 쓸 요소는 현재 실행 중인 고루틴 구조에 저장되고, 현재 고루틴은 sendq의 대기열에 추가되어 실행이 일시 중지됩니다.
  • 쓰기가 완료되고 잠금이 해제됩니다.

2.2.2 읽기 과정

  • 먼저 채널 글로벌 잠금을 읽어보세요.
  • sendq를 사용해 대기 대기열에서 대기 중인 고루틴을 가져오세요.
  • 대기 중인 고루틴과 버퍼(버퍼가 가득 찼음)가 있으면 버퍼 큐의 헤드에서 데이터를 가져온 다음 sendq에서 고루틴을 꺼냅니다. 고루틴의 데이터를 buf 비트에 저장하고 읽기를 종료하여 잠금을 해제합니다.
  • 대기 중인 고루틴이 없고 버퍼에 데이터가 있는 경우 버퍼 데이터를 직접 읽고 읽기 해제 잠금을 설명합니다.
  • 대기 중인 고루틴이 없고 버퍼가 없거나 버퍼 영역이 비어 있는 경우 현재 고루틴을 denq 대기열에 추가하고 절전 모드로 들어간 후 고루틴을 작성하여 깨어나기를 기다립니다. 잠금 해제를 완료합니다.

위 내용은 Golang 채널 구현에 대해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 csdn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
공연 경주 : 골랑 대 c공연 경주 : 골랑 대 cApr 16, 2025 am 12:07 AM

Golang과 C는 각각 공연 경쟁에서 고유 한 장점을 가지고 있습니다. 1) Golang은 높은 동시성과 빠른 발전에 적합하며 2) C는 더 높은 성능과 세밀한 제어를 제공합니다. 선택은 프로젝트 요구 사항 및 팀 기술 스택을 기반으로해야합니다.

Golang vs. C : 코드 예제 및 성능 분석Golang vs. C : 코드 예제 및 성능 분석Apr 15, 2025 am 12:03 AM

Golang은 빠른 개발 및 동시 프로그래밍에 적합한 반면 C는 극심한 성능과 기본 제어가 필요한 프로젝트에 더 적합합니다. 1) Golang의 동시성 모델은 Goroutine 및 Channel을 통한 동시성 프로그래밍을 단순화합니다. 2) C의 템플릿 프로그래밍은 일반적인 코드 및 성능 최적화를 제공합니다. 3) Golang의 쓰레기 수집은 편리하지만 성능에 영향을 줄 수 있습니다. C의 메모리 관리는 복잡하지만 제어는 괜찮습니다.

Golang의 영향 : 속도, 효율성 및 단순성Golang의 영향 : 속도, 효율성 및 단순성Apr 14, 2025 am 12:11 AM

goimpactsdevelopmentpositively throughlyspeed, 효율성 및 단순성.

C와 Golang : 성능이 중요 할 때C와 Golang : 성능이 중요 할 때Apr 13, 2025 am 12:11 AM

C는 하드웨어 리소스 및 고성능 최적화가 직접 제어되는 시나리오에 더 적합하지만 Golang은 빠른 개발 및 높은 동시성 처리가 필요한 시나리오에 더 적합합니다. 1.C의 장점은 게임 개발과 같은 고성능 요구에 적합한 하드웨어 특성 및 높은 최적화 기능에 가깝습니다. 2. Golang의 장점은 간결한 구문 및 자연 동시성 지원에 있으며, 이는 동시성 서비스 개발에 적합합니다.

Golang in Action : 실제 예제 및 응용 프로그램Golang in Action : 실제 예제 및 응용 프로그램Apr 12, 2025 am 12:11 AM

Golang은 실제 응용 분야에서 탁월하며 단순성, 효율성 및 동시성으로 유명합니다. 1) 동시 프로그래밍은 Goroutines 및 채널을 통해 구현됩니다. 2) Flexible Code는 인터페이스 및 다형성을 사용하여 작성됩니다. 3) NET/HTTP 패키지로 네트워크 프로그래밍 단순화, 4) 효율적인 동시 크롤러 구축, 5) 도구 및 모범 사례를 통해 디버깅 및 최적화.

Golang : Go 프로그래밍 언어가 설명되었습니다Golang : Go 프로그래밍 언어가 설명되었습니다Apr 10, 2025 am 11:18 AM

GO의 핵심 기능에는 쓰레기 수집, 정적 연결 및 동시성 지원이 포함됩니다. 1. Go Language의 동시성 모델은 고루틴 및 채널을 통한 효율적인 동시 프로그래밍을 실현합니다. 2. 인터페이스 및 다형성은 인터페이스 방법을 통해 구현되므로 서로 다른 유형을 통일 된 방식으로 처리 할 수 ​​있습니다. 3. 기본 사용법은 기능 정의 및 호출의 효율성을 보여줍니다. 4. 고급 사용에서 슬라이스는 동적 크기 조정의 강력한 기능을 제공합니다. 5. 레이스 조건과 같은 일반적인 오류는 Getest-race를 통해 감지 및 해결할 수 있습니다. 6. 성능 최적화는 sync.pool을 통해 개체를 재사용하여 쓰레기 수집 압력을 줄입니다.

Golang의 목적 : 효율적이고 확장 가능한 시스템 구축Golang의 목적 : 효율적이고 확장 가능한 시스템 구축Apr 09, 2025 pm 05:17 PM

Go Language는 효율적이고 확장 가능한 시스템을 구축하는 데 잘 작동합니다. 장점은 다음과 같습니다. 1. 고성능 : 기계 코드로 컴파일, 빠른 달리기 속도; 2. 동시 프로그래밍 : 고어 라틴 및 채널을 통한 멀티 태스킹 단순화; 3. 단순성 : 간결한 구문, 학습 및 유지 보수 비용 절감; 4. 크로스 플랫폼 : 크로스 플랫폼 컴파일, 쉬운 배포를 지원합니다.

SQL 분류의 진술에 의한 순서 결과가 때때로 무작위로 보이는 이유는 무엇입니까?SQL 분류의 진술에 의한 순서 결과가 때때로 무작위로 보이는 이유는 무엇입니까?Apr 02, 2025 pm 05:24 PM

SQL 쿼리 결과의 정렬에 대해 혼란스러워합니다. SQL을 학습하는 과정에서 종종 혼란스러운 문제가 발생합니다. 최근 저자는 "Mick-SQL 기본 사항"을 읽고 있습니다.

See all articles

핫 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기