Go의 동시 소개
그러나, 간단하게 보기 위해서, 많은 기초 강좌들은 한 번에 하나의 프로세서 핵을 사용하기를 원합니다.
여러 개의 핵을 사용하려면 진정한 라인이 필요하기 때문이다.동기화 작업이 매우 도전적이기 때문에 라인을 사용하는 것은 매우 어렵다.모든 라인(또는 블록)이 서로 다른 시간에 완성될 뿐만 아니라 통상적으로 무질서하기 때문에 동시에 작업은 매우 도전적이다.일부 작업은 모든 라인의 결과를 통합해야 할 수도 있고, 합병 결과의 순서에 영향을 받을 수도 있다.그 밖에 얼마나 많은 라인을 생성할지 선택하는 것은 간단한 연습이 아니다.
초보자에게도 병발을 간단하게 하기 시작했다.
Go는 경량급 라인과 유사한 진정한 라인이 아닌 goroutines를 제공했다.Go는 언어의 stdlib 자체에 내장된 도구를 제공함으로써 병렬 처리를 쉽게 합니다.또한 Go는 생성된 Goroutine을 처리하기 위해 정확한 수량의 실제 라인을 생성합니다.Go는 모든 Goroutine의 결과에 응답하는 방법과 모든 Goroutine가 완성되기를 기다리는 방법을 제공합니다.
Goroutines를 기다리는 것은 Wait Groups를 사용하는 간단한 작업입니다.대기 그룹은 진행 중인 고로틴의 계수기와 같다.WaitGroup을 사용하는 방법에 대한 개요는 다음과 같습니다.
하나의 옵션은goroutine에 변수를 가리키는 바늘을 전달하고 그 변수 자체에 변이를 허용하는 것입니다.전달 지침을 보여주기 위해서, 나는 '하나의 숫자의 제수를 계산하는 것' 코드를 예로 들었다.
임무는 "정수 n의 제수를 계산합니다."이다.
예컨대
divisors(4) == 3 // 1, 2, 4
divisors(5) == 2 // 1, 5
divisors(12) == 6 // 1, 2, 3, 4, 6, 12
divisors(30) == 8 // 1, 2, 3, 5, 6, 10, 15, 30
다음은 포인터를 사용하여 변수를 증가수 n의 제수에 인용하여 전달하는 해결 방안이다.다른 선택은 채널을 사용하는 것입니다.채널을 사용할 때,goroutines는 공유 바늘을 사용하지 않고 메시지를 통해 통신합니다.Go는 배열, 슬라이스, 문자열, 맵 또는 채널을 반복할 수 있는 범위 연산자를 제공합니다.채널에서 for 순환을 사용하면 모든 메시지를 받을 때 처리할 수 있습니다
for x := range ch {
// do some work
}
우리가 채널을 완성한 후에 다른 작업이 완료되기를 기다리지 않았음을 표시하기 위해 채널을 닫는 것을 기억해야 합니다.그렇지 않으면, 우리는 실행 정지 자물쇠를 초래할 수 있습니다. (이것은 우리가 피하고자 하는 싫은 다중 루틴 도전 중의 하나입니다.)p>
사용 채널을 통해 우리는 작업을 분해하고 결과를 중앙 프로세서에 피드백할 수 있습니다.다음 예제를 참조하십시오
위의 코드를 실행하고 싶으면, 여기에 삽입식 리플이 있습니다.위에서 설명한 Go 동시 모드 조정, 분기, 테스트 및 검토에 사용
조금 놀라운 것은 병발하지 않는 간단한 순환이 가장 빠르다는 것이다. 나는 여전히 왜 그런지 알고 싶다.Golang의 또 다른 장점은 테스트와 기준 테스트에 대한 지원이 내장되어 있다는 것이다.다음에 나는 위의 함수를 위해 기준을 하나 짰다.나는 간단한 순환 속도가 가장 빠르다고 생각한다. 왜냐하면 메모리 분배를 하지 않을 뿐만 아니라, 컴파일러가 최적화되었기 때문이다.그러나 실제 워크로드에 대해 나는 여전히 병렬 및 병행화가 전체 성능에 가장 좋다고 생각한다
이후 우리는 계속 대량의 자원을 투입할 것이다:
- 일반적으로: https://learnxinyminutes.com/docs/go/
- 바둑에서의 병발 여행: https://tour.golang.org/concurrency/1
- Codewars Kata를 사용하여 연습 및 발송(내 솔루션처럼 https://www.codewars.com/kata/reviews/5e2ad3aa7c353f0001f89009/groups/5f6b1fe9fa12d400012d40c7)
Reference
이 문제에 관하여(Go의 동시 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/barakplasma/concurrency-in-go-5da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)