GO: 입문자를 위한 동시성 대 병렬성.

WBOY
풀어 주다: 2024-08-23 12:30:31
원래의
644명이 탐색했습니다.

다소 모욕적인 제목의 게시물에 오신 것을 환영합니다.
하지만 이번 포스팅에서는 제가 가장 좋아하는 프로그래밍 언어 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 <- 42 // Enviar un valor por el canal
}()
value := <-ch // Recibir un valor del canal
로그인 후 복사

실제 예:

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 <= 5; i++ {
        go worker(i, c)
    }

    for n := 1; n <= 10; n++ {
        c <- n
    }
    close(c)

    time.Sleep(time.Second)
}
로그인 후 복사

이 코드의 출력은 다음과 같습니다

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/트위터
깃허브

위 내용은 GO: 입문자를 위한 동시성 대 병렬성.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!