다소 저속한 제목의 게시물에 오신 것을 환영합니다.
하지만 이번 포스팅에서는 제가 가장 좋아하는 프로그래밍 언어인 GOLANG.
주방을 상상해 보세요.:
요리 요리: 이는 작업을 나타냅니다.
요리사: 그는 가공업자입니다.
동시 발생:
주방의 여러 요리사: 각자 다른 요리를 준비합니다.
In Go: 모든 요리사는 고루틴이 됩니다. 주방(가공기)에는 오븐이 하나만 있지만 요리사는 오븐이 사용 가능해질 때까지 기다리는 동안 다른 작업에 시간을 보내면서 동시에 요리 작업을 할 수 있습니다.
병행:
다양한 오븐: 각 요리사는 자신만의 오븐을 가지고 있습니다.
In Go: 물리적 프로세서가 여러 개 있는 경우 각 고루틴은 서로 다른 프로세서에서 실행되어 실제 생활에서 동시에 여러 요리를 요리할 수 있습니다.
차이점은 무엇인가요?
동시성: 작업이 서로 얽혀 실행되어 단일 프로세서에서도 병렬 처리의 환상을 제공합니다.
병렬성: 작업은 여러 프로세서에서 동시에 실행되므로 프로세스 속도가 크게 향상됩니다.
Go에서 어떻게 사용하나요?
고루틴: 가벼운 스레드와 같습니다. 고루틴을 만들려면 함수 앞에 go 키워드를 사용하면 됩니다:
golang에서 고루틴을 사용하는 방법의 예를 살펴보겠습니다.
go func() { // Código que se ejecutará en una goroutine }()
채널: 고루틴이 통신하고 동기화할 수 있는 파이프입니다.
요리사들 사이에 재료를 전달하는 튜브라고 상상해 보세요
ch := make(chan int) go func() { ch실제 예:
package main import ( "fmt" "time" ) func worker(id int, c chan int) { for n := range c { fmt.Printf("Worker %d received %d\n", id, n) time.Sleep(time.Second) } } func main() { c := make(chan int) for i := 1; i이 코드의 출력은 다음과 같습니다.
Worker 1 received 1 Worker 2 received 2 Worker 3 received 3 Worker 4 received 4 Worker 5 received 5 Worker 1 received 6 Worker 2 received 7 Worker 3 received 8 Worker 4 received 9 Worker 5 received 10가끔은 이렇게 보일 수도 있지만
Worker 5 received 1 Worker 1 received 3 Worker 2 received 2 Worker 4 received 5 Worker 3 received 4 Worker 3 received 6 Worker 5 received 10 Worker 2 received 8 Worker 4 received 7 Worker 1 received 9또는 이런 식으로
Worker 5 received 1 Worker 1 received 2 Worker 2 received 3 Worker 3 received 4 Worker 4 received 5 Worker 1 received 6 Worker 2 received 7 Worker 3 received 8 Worker 5 received 9 Worker 4 received 10프로그램을 실행할 때마다 출력이 변경되는 이유는 무엇입니까?
실행할 때마다 프로그램 출력이 변경되는 주된 이유는 동시성의 비결정적 특성 때문입니다.
현재 상황에 대한 분석은 다음과 같습니다.:
채널 만들기: make(chan int)는 정수 채널을 만듭니다. 이 채널은 고루틴 간의 통신에 사용됩니다.
고루틴 시작: i에 대한 루프 := 1; 나는 작업자 함수는 ID와 채널을 받습니다.
채널에 값 보내기: n에 대한 루프 := 1; n 1부터 10까지의 값을 채널로 보냅니다.
채널 닫기: close(c) 호출은 채널을 닫아 더 이상 값이 전송되지 않음을 나타냅니다.
채널에서 값 수신: 각 고루틴은 for n := range c 루프를 사용하여 채널에서 값을 수신합니다. 값이 수신되면 콘솔에 인쇄됩니다.
고루틴이 완료될 때까지 대기: time.Sleep(time.Second) 호출은 기본 고루틴이 종료하기 전에 다른 고루틴이 완료될 때까지 기다립니다.
지금까지:
채널을 통해 숫자를 수신하는 5개의 고루틴(요리사)을 만듭니다.
요리사가 처리할 수 있도록 채널에 번호를 보냅니다.
요리사는 동시에 작업하며 숫자를 받는 대로 처리합니다.Go에서 동시성과 병렬성을 사용하는 이유는 무엇인가요?
더 나은 성능: 특히 I/O 바인딩 작업(예: 파일 읽기 또는 HTTP 요청 만들기)에서.
응답성 향상: 작업이 차단된 동안에도 애플리케이션은 다른 요청에 계속 응답할 수 있습니다.
더 확장 가능한 아키텍처: 여러 코어 또는 시스템에 작업을 배포할 수 있습니다.기억하다!
동시성과 병렬성은 강력한 도구이지만 이해하고 디버그하기가 더 복잡해지는 코드를 만들 수도 있습니다. 이를 주의 깊게 사용하고 그 의미를 이해하는 것이 중요합니다.
특정 주제에 대해 더 자세히 알아보고 싶으신가요?
다음과 같은 개념을 탐색할 수 있습니다.
동기화: 뮤텍스, 작업 그룹 등
동시성 패턴: 생산자-소비자, 파이프라인 등
동시 테스트: 동시 코드를 효과적으로 테스트하는 방법인사말,
루카토니 라우달레스X/트위터
Github
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3