"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > GO: 초보자를 위한 동시성 대 병렬성.

GO: 초보자를 위한 동시성 대 병렬성.

2024-09-01에 게시됨
검색:965

다소 저속한 제목의 게시물에 오신 것을 환영합니다.
하지만 이번 포스팅에서는 제가 가장 좋아하는 프로그래밍 언어인 GOLANG.

를 사용하여 프로그래밍의 이 두 가지 특징이 무엇인지 매우 간단한 방법으로 설명하고 싶습니다.

주방을 상상해 보세요.:

요리 요리: 이는 작업을 나타냅니다.
요리사: 그는 가공업자입니다.
동시 발생:

주방의 여러 요리사: 각자 다른 요리를 준비합니다.
In Go: 모든 요리사는 고루틴이 됩니다. 주방(가공기)에는 오븐이 하나만 있지만 요리사는 오븐이 사용 가능해질 때까지 기다리는 동안 다른 작업에 시간을 보내면서 동시에 요리 작업을 할 수 있습니다.
병행:

다양한 오븐: 각 요리사는 자신만의 오븐을 가지고 있습니다.
In Go: 물리적 프로세서가 여러 개 있는 경우 각 고루틴은 서로 다른 프로세서에서 실행되어 실제 생활에서 동시에 여러 요리를 요리할 수 있습니다.

차이점은 무엇인가요?

동시성: 작업이 서로 얽혀 실행되어 단일 프로세서에서도 병렬 처리의 환상을 제공합니다.
병렬성: 작업은 여러 프로세서에서 동시에 실행되므로 프로세스 속도가 크게 향상됩니다.

Go에서 어떻게 사용하나요?

고루틴: 가벼운 스레드와 같습니다. 고루틴을 만들려면 함수 앞에 go 키워드를 사용하면 됩니다:

GO: Concurrencia vs Paralelismo Para Tontos.

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

릴리스 선언문 이 기사는 https://dev.to/lucatonyraudales/go-concurrencia-vs-paralelismo-para-tontos-2fnn?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3