>백엔드 개발 >Golang >Go 언어에서 동시성을 수행하는 방법

Go 언어에서 동시성을 수행하는 방법

青灯夜游
青灯夜游원래의
2023-01-18 14:19:011805검색

Go 언어는 컴파일러 런타임(런타임)을 통해 동시성 기능을 지원합니다. 동시성은 고루틴을 통해 완성됩니다. 고루틴은 단일 프로세스에서 수천 개의 동시 작업을 수행할 수 있는 매우 가벼운 구현입니다. 이는 Go 언어 동시성 설계의 핵심입니다. go 키워드를 사용하여 고루틴을 생성하고, 호출해야 하는 함수 앞에 go 선언을 배치하고, 동일한 주소 공간에서 함수를 호출하고 실행하면 함수가 독립적인 동시 스레드로 실행됩니다.

Go 언어에서 동시성을 수행하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

동시성이란 여러 작업을 동시에 실행할 수 있음을 의미합니다. 동시 프로그래밍은 다중 스레드 프로그래밍, 다중 프로세스 프로그래밍 및 분산 프로그램을 포함하여 광범위한 의미를 갖습니다.

Go 언어는 컴파일러 런타임을 통해 동시성 기능을 지원합니다. Go 언어의 동시성은 goroutine 기능을 통해 수행됩니다. 고루틴은 스레드와 유사하지만 필요에 따라 동시에 작동하도록 여러 고루틴을 생성할 수 있습니다. 고루틴은 Go 언어의 런타임에 의해 예약되는 반면 스레드는 운영 체제에 의해 예약됩니다.

Go 언어는 여러 고루틴 간에 통신할 수 있는 채널도 제공합니다. 고루틴과 채널은 Go 언어가 준수하는 CSP(Communicating Sequential Process) 동시성 모델을 위한 중요한 구현 기반입니다.

고루틴 소개

고루틴은 단일 프로세스에서 수천 개의 동시 작업을 수행할 수 있는 매우 가벼운 구현입니다. 이는 Go 언어 동시성 설계의 핵심입니다.

최종 분석에서 고루틴은 실제로 스레드이지만 스레드보다 작습니다. 12개의 고루틴이 하위 레이어의 5~6개 스레드에 반영될 수 있으며 Go 언어도 고루틴 간 메모리 공유를 구현합니다.

go 키워드를 사용하여 고루틴을 만들고, 호출해야 하는 함수 앞에 go 선언을 넣고, 동일한 주소 공간에서 이 함수를 호출하고 실행하면 함수가 실행될 때 독립적인 역할을 하게 됩니다. 동시 스레드. Go 언어에서는 이러한 종류의 스레드를 고루틴이라고 합니다.

고루틴은 다음과 같이 사용됩니다:

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

고루틴은 멀티 코어 CPU 환경에서 병렬이기 때문에 코드 블록이 여러 고루틴에서 실행되면 코드 병렬성을 달성한 것입니다.

프로그램 실행을 알아야 하는 경우 병렬 결과를 얻는 방법은 무엇입니까? 채널과 함께 사용해야 합니다.

channel

channel은 언어 수준에서 Go 언어가 제공하는 고루틴 간의 통신 방식입니다. 채널을 사용하여 두 개 이상의 고루틴 간에 메시지를 전달할 수 있습니다.

채널은 프로세스 내 통신 방법이므로 채널을 통해 객체를 전달하는 프로세스는 함수 호출 시 매개변수 전달 동작과 일치합니다. 예를 들어 포인터도 전달할 수 있습니다. 프로세스 간 통신이 필요한 경우 소켓이나 HTTP와 같은 통신 프로토콜을 사용하는 등 분산 시스템 접근 방식을 사용하는 것이 좋습니다. Go 언어는 또한 인터넷을 완벽하게 지원합니다.

Channel은 유형과 관련되어 있습니다. 즉, 채널은 한 가지 유형의 값만 전달할 수 있으며 채널을 선언할 때 이 유형을 지정해야 합니다. Unix 파이프에 대해 알고 있다면 유형 안전 파이프로 간주될 수 있는 채널을 이해하는 것이 어렵지 않습니다.

채널을 정의할 때 채널에 전송되는 값의 유형도 정의해야 합니다. 채널을 생성하려면 make를 사용해야 합니다. 코드는 다음과 같습니다.

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

Windows 및 Linux 이전의 고대 시대로 돌아가 보겠습니다. 프로그램을 개발할 때 나타나는 명령형 프로그래밍 언어는 직렬화를 기반으로 하기 때문에 동시성의 개념이 없습니다. 프로그램은 각 명령을 순차적으로 실행합니다. 전체 프로그램에는 하나의 실행 컨텍스트, 즉 호출 스택과 힙만 있습니다.

동시성은 프로그램이 런타임에 여러 호출 스택에 해당하는 여러 실행 컨텍스트를 갖는다는 것을 의미합니다. 우리는 각 프로세스가 실행될 때 자체 호출 스택과 힙 및 완전한 컨텍스트를 가지고 있다는 것을 알고 있습니다. 운영 체제는 프로세스를 예약할 때 프로세스가 타임 슬라이스를 얻은 후 예약된 프로세스의 컨텍스트를 저장합니다. 프로세스의 컨텍스트를 시스템에 복원합니다.

전체 운영 체제의 관점에서 여러 프로세스가 동시에 실행될 수 있는데 동시성의 가치는 무엇인가요? 먼저 다음 시나리오를 살펴보겠습니다.

1) 한편으로는 반응성이 뛰어난 그래픽 사용자 인터페이스가 필요한 반면, 프로그램은 많은 수의 작업이나 IO 집약적인 작업을 수행해야 하며 인터페이스 응답 및 작업이 실행되도록 해야 합니다. 동시에.

2) 우리 웹 서버가 많은 사용자 요청에 직면할 때, 각각의 사용자에 응답하기 위해 더 많은 "웹 서버 작업 단위"가 필요합니다.

3) 우리의 거래는 분산된 환경에서 이루어집니다. 동일한 작업 단위가 서로 다른 컴퓨터에서 분할된 데이터를 처리합니다. 컴퓨터의 CPU는 단일 코어에서 다중 코어로 발전하며, 우리의 프로그램은 컴퓨터 하드웨어의 기능을 활용하지 않습니다.

4) IO 작업으로 인해 당사 프로그램이 차단되어 전체 프로그램이 정체된 상태이며 IO와 관련 없는 다른 작업을 실행할 수 없습니다.

위의 예에서 볼 수 있듯이 직렬 프로그램은 여러 시나리오에서 요구 사항을 충족할 수 없습니다. 아래에서는 모든 사람이 동시성이 필수적이라는 것을 깨닫게 하기 위해 동시성 프로그램의 몇 가지 장점을 요약했습니다.

  • 동시성은 문제 모델을 보다 객관적으로 표현할 수 있습니다.

  • 동시성은 CPU 코어의 장점을 최대한 활용하고 프로그램의 효율성 실행 효율성

  • 동시성은 CPU와 다른 하드웨어 장치 간의 고유한 비동기성을 최대한 활용할 수 있습니다.

【관련 권장 사항: Go 비디오 튜토리얼, 프로그래밍 교육

위 내용은 Go 언어에서 동시성을 수행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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