Grow with AppMaster Grow with AppMaster.
Become our partner arrow ico

고루틴

고루틴

Go 프로그래밍 언어의 가장 인기 있는 측면 중 하나는 컴퓨터가 동시에 많은 작업을 수행할 수 있는 능력에 대한 최고 수준의 지원입니다. 코드를 동시에 실행하는 기능은 컴퓨터가 단일 코드 흐름을 더 빠르게 실행하는 것에서 동시에 많은 스트림을 실행하는 것으로 전환함에 따라 프로그래밍에서 더욱 중요해지고 있습니다. 더 빠르게 실행되는 프로그램을 만들기 위해 프로그래머는 시스템의 각 동시 요소가 다른 요소와 독립적으로 실행될 수 있도록 동시에 실행되도록 설계해야 합니다.

두 가지 Go 기능인 Goroutines 및 채널을 함께 사용하면 동시성이 더 쉬워집니다. Goroutines 은 이 기능을 위한 기본 원시 유형을 제공합니다. Goroutines 은 메모리 공간, 스레드 간 상호 작용 및 네트워크 연결과 관련하여 저렴합니다. 또한 많은 프로그래밍 언어가 지원하는 스레드보다 시작 시간이 더 좋습니다. 본질적으로 Go 는 고 Goroutines 을 Java 및 기타 프로그래밍 언어가 스레드라고 하는 것으로 참조합니다.

Goroutines 이란?

고루틴은 프로그램의 나머지 부분과 동시에 수행되는 Golang의 간단한 구현 스레드입니다. Goroutines 생성 비용이 매우 낮기 때문에 고루틴은 표준 스레드와 유사할 때 저렴합니다. 따라서 동시 프로그래밍을 위해 Go 에서 광범위하게 사용됩니다. 모든 프로그램은 메인 고루틴으로 알려진 최소한 하나의 고루틴으로 구성됩니다. 메인 고루틴은 다른 모든 고루틴을 제어합니다. 따라서 메인 고루틴이 종료되면 스크립트의 다른 모든 고루틴도 종료됩니다. 고루틴은 항상 백그라운드에서 활성화됩니다.

예: 다음은 예입니다. 공책에 무언가를 쓰고 있는데 배가 고파집니다. 당신은 휴식을 취하고 음식을 얻을 것입니다. 그런 다음 다시 쓰기 시작합니다. 현재 동시 고용으로 간주되는 시간대별로 두 가지 역할(쓰기 및 식사)을 수행하고 있습니다. 이 두 가지 작업(쓰기와 먹기)은 여전히 동시에 완료되어야 한다는 점을 강조해야 합니다. 항목이 동시에 완료되는 경우 병렬 처리라고 합니다(칩을 씹으면서 휴대전화를 사용한다고 상상해 보세요). 동시성은 동시에 많은 것과 상호 작용하는 것을 포함합니다. 병렬 처리(동시에 많은 일을 수행함)는 일정표가 있는 이것의 하위 클래스(동시에 수행할 필요는 없음)입니다.

함수 호출에 go 키워드를 적용하여 고루틴을 추가할 수 있습니다. 작동하는 호출에 go 키워드를 적용하면 동시성을 성능으로 설정합니다. 하지만 먼저 go 키워드를 실행에 적용했을 때의 효과를 확인해보자. 프로그램에 두 개의 고루틴이 있다고 가정해 봅시다. " package main import " 텍스트는 프로그램의 항목이 될 것입니다. Go 에서 패키지 기본 가져오기는 선언적 가져오기 문입니다. 주요 고루틴( first goroutine)이 암시됩니다. go( f)를 실행하면 두 번째 고루틴이 형성됩니다(0). 일반적으로 우리 소프트웨어는 다음 줄로 넘어가기 전에 기능을 실행할 때 기본 기능의 모든 명령을 실행합니다.

다음 단계로 넘어가기 전에 고루틴으로 절차를 빠르게 실행할 수 있습니다. 결과적으로 scanln 메서드가 추가되었습니다. 그렇지 않으면 모든 숫자를 표시하기 전에 코드가 종료됩니다. Goroutines 은 만들기가 간단하고 대량으로 만들 수 있습니다. 이 소프트웨어가 실행될 때 고루틴은 동시에 작동하지 않고 순차적으로 작동하는 것처럼 보입니다.

normal vs goroutine

스레드보다 Goroutines 의 장점

Goroutines 은 비용이 적게 듭니다.

Goroutines 은 다른 프로세스보다 저렴합니다. 질량 크기는 몇 킬로바이트에 불과하며 스택 크기가 정의되어야 하고 영구적인 스레드와 달리 프로그램의 요구에 맞게 확장하거나 축소할 수 있습니다.

다중화 Goroutines 이 있습니다.

다중화되는 운영 체제 스레드는 거의 없습니다. 수백 개의 고루틴이 있는 프로그램에서는 프로세스가 하나만 있을 수 있습니다. 나머지 고루틴은 새 운영 체제 프로세스로 전송됩니다. 예를 들어 사용자 개입을 모색할 때 해당 프로세스의 고루틴이 중단되었다고 가정합니다. 런타임은 이들 각각을 관리하며 우리 개발자에게는 이러한 미묘한 복잡성으로부터 격리되면서 동시에 관리할 수 있는 명확한 API 가 제공됩니다.

Goroutines 은 채널을 사용하여 통신합니다.

Goroutines 은 채널을 사용하여 대화합니다. 관련 메모리를 공유할 때 발생하는 경쟁 상황을 방지하기 위한 것입니다. 채널은 고루틴이 상호 작용하는 데 사용하는 도관과 비교할 수 있습니다.

채널이란 무엇입니까?

두 고루틴은 서로 상호 작용하고 채널을 통해 작업을 조정할 수 있습니다. 이 소프트웨어는 계속해서 " ping "을 인쇄합니다. 채널 형식을 지정하기 위해 접두사 " chan "은 채널에서 전송되는 항목을 수반합니다." 이 경우 문자열을 제공하고 있습니다. 채널에서는 연산자를 사용하여 메시지를 보내고 받습니다. " ping "은 보내는 것을 말합니다. " ping ".

Try AppMaster no-code today!
Platform can build any web, mobile or backend application 10x faster and 3x cheaper
Start Free

채널은 두 고루틴을 동기화하는 데 사용됩니다. 채널을 통해 메시지를 전송하기 전에 라우터는 프린터가 메시지를 수락할 준비가 될 때까지 기다립니다. 이에 대한 용어는 억제입니다. 채널을 생성할 때 두 번째 매개변수를 make 함수에 사용할 수 있습니다. c:= make (chan int, 1)

채널의 방향

채널 양식의 방향과 매개변수를 수신하거나 전송할 매개변수를 정의할 수 있습니다. 예를 들어, 핑거의 메소드 기호는 다음과 같이 변경할 수 있습니다.

func pinger(c chan<- string)

C는 지금만 보낼 수 있습니다. c에서 수신하면 코드 오류가 발생합니다. 마찬가지로 출력을 다음과 같이 수정할 수 있습니다.

func printer(c string -chan)

세미 채널에는 이러한 제약이 없습니다. 양방향 채널은 전송 전용 또는 수신 전용 채널만 허용하는 절차에 제공될 수 있지만 그 반대는 허용하지 않습니다.

Go-channels

고루틴을 만드는 방법?

고루틴을 실행하는 방법은 간단합니다. " go " 키워드를 함수 호출에 적용하여 동시에 실행되는 고루틴을 만듭니다. 여기서 우리는 고루틴을 만들 것입니다. 두 가지 기능을 포함하는 프로그램이 있다고 가정해 봅시다. 하나는 환영 기능이고 다른 하나는 주 기능입니다.

새로운 고루틴을 생성할 때, welcome() 코드는 main() 함수와 함께 실행될 것입니다. 이 프로그램을 수행하면 놀랄 것입니다. 이 프로그램은 주요 작업 텍스트만 표시합니다. 우리가 시작한 첫 번째 고루틴이나 새로운 고루틴은 어떻게 되었습니까? 왜 이런 일이 발생하는지 이해하려면 먼저 고루틴의 두 가지 주요 기능을 알아야 합니다.

  • 고루틴 함수는 새로운 고루틴을 생성할 때 즉시 응답합니다. 기능 외에도 관리는 고루틴에 의존하지 않으므로 실행이 완료될 때까지 기다리지 않습니다. 실행은 고루틴 함수 이후의 다음 코드 블록으로 전달됩니다. 이것이 고루틴에서 주어진 매개변수가 무시되는 이유입니다.
  • 모든 추가 고루틴은 기본 고루틴과 동시에 실행되어야 합니다. 주 고루틴이 실패하면 프로그램이 종료되고 추가 고루틴이 실행되지 않습니다.

이제 코드가 작동하지 않는 이유를 이해했습니다. go welcome()을 호출한 후 hello goroutine이 완료되기를 기다리기 전에 다음 코드 줄로 제어를 이양하고 주요 기능을 출력했습니다. 수행할 스크립트가 없어서 메인 고루틴이 죽고 헬로 고루틴이 실행되지 않습니다.

1초 동안 고루틴을 일시 중지하기 위해 sleep 기술( time.sleep(1 * time.second))을 호출했습니다. go welcome() 함수는 이제 메인 고루틴이 종료되기 전에 완료하기에 충분한 시간이 있습니다. 이 소프트웨어는 처음에 " welcome goroutine "을 작성한 다음 주 기능을 인쇄하기 전에 1초를 기다립니다. 우리는 다른 고루틴이 완료되도록 잠시 멈추기 위해 기본 고루틴에서 sleep 기술을 사용합니다.

여러 Goroutines 만들기

여러 고루틴을 생성하기 위해 다른 프로그램을 시작할 것입니다. 먼저 병렬로 실행될 두 개의 고루틴을 생성하여 시작할 수 있습니다. 이 두 고루틴은 숫자 고루틴[go number()]과 알파벳 고루틴[ go alphabets ()]입니다.

숫자 goroutine은 1을 인쇄하기 전에 250ms 동안 유지되고 2를 인쇄하기 전에 다시 쉬는 식으로 5가 생성될 때까지 계속됩니다. 마찬가지로 영숫자 goroutine은 a에서 e까지의 문자를 표시한 다음 400밀리초 동안 기다립니다. 마지막으로 기본 고루틴은 정수와 영숫자를 생성하고 잠시 멈춘 다음 기본 고루틴을 종료합니다.

빈번한 동시 프로그래밍 실수

  • 이것이 필요할 때 동기화의 부재
  • 시간을 사용하십시오. 동기화를 위한 슬립 콜
  • 표준 동기화 패키지에 있는 유형의 사본 값을 매달린 고루틴을 유지합니다.
  • 동기화 호출
  • 대기 그룹
  • 잘못된 위치에 메소드 추가
  • 마지막 기능 발신자 고루틴이 아닌 가까운 내일 채널로 채널을 사용하십시오.

결론

이 기사에서는 go 키워드를 사용하여 하나의 고루틴과 동시에 정수를 출력하는 여러 고루틴을 실행하는 프로그램을 개발했습니다. 그 프로그램을 시작한 후 우리는 새로운 채널을 만들었습니다. 그런 다음 한 고루틴에서 숫자를 생성하고 화면에 표시할 수 있도록 다른 고루틴으로 전달하는 데 사용했습니다. 다중 코어 시스템에서 애플리케이션의 속도를 높이기 위해 고루틴을 시작하는 방법에 대한 마지막 데모로 많은 "인쇄" 고루틴을 동시에 시작했습니다.

알다시피 고루틴은 작업을 보다 빠르고 효율적으로 수행하는 방법입니다. 이것은 응용 프로그램의 기능을 향상시키기 위해 AppMaster 에서 제공하는 배포 절차 중 하나입니다. AppMaster 를 사용하면 프로그래밍 지식이 거의 또는 전혀 없는 사람도 수동 코딩을 통해 완료하기 어려운 작업을 완료할 수 있습니다.

AppMaster 는 백엔드는 물론 모바일 및 웹 애플리케이션을 생성 할 수 있는 no-code 플랫폼입니다. 흥미로운 사실 AppMasterGo 에서 초당 22,000줄로 백엔드를 생성하고 소스 코드에 액세스할 수 있습니다.

관련 게시물

확장 가능한 호텔 예약 시스템을 개발하는 방법: 완전한 가이드
확장 가능한 호텔 예약 시스템을 개발하는 방법: 완전한 가이드
확장 가능한 호텔 예약 시스템을 개발하는 방법을 알아보고, 아키텍처 디자인, 주요 기능 및 원활한 고객 경험을 제공하기 위한 최신 기술 선택을 살펴보세요.
투자 관리 플랫폼을 처음부터 개발하기 위한 단계별 가이드
투자 관리 플랫폼을 처음부터 개발하기 위한 단계별 가이드
효율성을 높이기 위해 현대 기술과 방법론을 활용하여 고성능 투자 관리 플랫폼을 만드는 체계적인 경로를 살펴보세요.
귀하의 요구 사항에 맞는 올바른 건강 모니터링 도구를 선택하는 방법
귀하의 요구 사항에 맞는 올바른 건강 모니터링 도구를 선택하는 방법
라이프스타일과 요구 사항에 맞는 올바른 건강 모니터링 도구를 선택하는 방법을 알아보세요. 정보에 입각한 결정을 내리는 포괄적인 가이드입니다.
무료로 시작하세요
직접 시도해 보고 싶으신가요?

AppMaster의 성능을 이해하는 가장 좋은 방법은 직접 확인하는 것입니다. 무료 구독으로 몇 분 만에 나만의 애플리케이션 만들기

아이디어를 실현하세요