• SEARCH

    통합검색
  • GAMEZONE
    • 커뮤니티
      • 공지사항
      • 유저게시판
        • 등업게시판
        • 출석체크
        • 정회원 무료자료실
      • 스크린샷
      • 인증자료실
    • 리니지
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 메이플스토리
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 바람의나라
      • 자유게시판
      • 홍보게시판
      • 자료게시판
        • 유틸자료실
        • 소스자료실
        • 클라이언트
        • 팩 자료실
      • 연구게시판
        • 개발내역
        • 질문과답변
        • 기타
      • 강의게시판
        • DR
        • CR
        • 구버전
        • 클라이언트 개조
        • 노하우 게시판
        • 게임공략 & 팁
    • 다크에덴
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 믹스마스터
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 라그나로크
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 기타게임
      • 게임공략 & 팁
      • 홍보게시판
      • 유틸자료실
      • 소스자료실
      • 자유게시판
      • 노하우 게시판
    • 게임강의
    • 비베&포토샵
      • 자유게시판
      • 자료실
        • 일반자료실
        • 포인트 자료실
      • 노하우게시판
      • 포토샵게시판
    • 모바일
      • 게임공략
      • 포인트 자료실
      • 유틸자료실
      • 자유게시판
  • 기타게임 소스자료실
    • 기타게임 소스자료실 기타
    • [Go 공식문서 한국어 정리] ⑤7. Codewalk: Share Memory By Communicating

      • 오뉴노노
      • 2026.05.30 - 03:29 5

    [Go 공식문서 한국어 정리] ⑤7. Codewalk: Share Memory By Communicating
    원문: https://go.dev/doc/codewalk/sharemem/

    #Go #Golang #Concurrency #Channel #Goroutine #Codewalk #공식문서

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    1. 서론
    이 문서는 Go의 핵심 철학인 "메모리를 공유하여 통신하지 말고, 통신하여 메모리를 공유하라(Don't communicate by sharing memory; share memory by communicating)"를 실제 코드 예제를 통해 설명하는 Codewalk입니다. 채널을 통해 데이터의 소유권(ownership)을 옮기는 방식으로 동시성 문제를 해결하는 방법을 보여줍니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    2. 핵심개념
    • Go의 동시성 철학: 채널을 통한 메모리 공유
    • 소유권(ownership) 개념: 포인터를 채널로 전달하면 데이터의 소유권이 함께 이동
    • 공유 자원(Resource)과 상태(State) 타입
    • 다중 고루틴 간 채널 기반 협업

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    3. 주요내용상세

    3.1 프로그램 개요
    이 프로그램은 URL 목록을 주기적으로 폴(poll)하여 HTTP 응답 코드를 확인하고, 각 URL의 현재 상태를 주기적으로 출력하는 간단한 프로그램입니다. 다음과 같은 고루틴들이 협력합니다:

    • Poller 고루틴: URL을 폴하고 상태를 반환
    • StateMonitor 고루틴: 모든 URL의 상태를 추적 및 출력
    • main 고루틴: 리소스를 관리하고 지연 시간 조정

    3.2 Resource 타입과 소유권 이동
    Resource 타입은 폴할 URL과 마지막 성공 이후 에러 횟수를 저장합니다. 프로그램 시작 시 각 URL에 대해 하나의 Resource가 할당됩니다. main 고루틴과 Poller 고루틴은 Resource 포인터를 채널로 서로 주고받습니다.

    이 프로그램에서 채널로 Resource 포인터를 본내는 것은 해당 데이터의 소유권을 본내는 쪽(sender)에서 받는 쪽(receiver)으로 이전한다는 규칙을 따릅니다. 이 규칙 덕분에 두 개 이상의 고루틴이 동시에 같은 Resource에 접근하지 않음을 알 수 있으며, 따라서 데이터 구조에 대한 잠금(locking)을 걱정할 필요가 없습니다.

    3.3 Poller 함수
    각 Poller는 입력 채널(in)으로부터 Resource 포인터를 받아 Poll() 메서드를 호출하고, 그 결과를 status 채널로 StateMonitor에 전달한 뒤, 완료된 Resource 포인터를 출력 채널(out)로 본냅니다. 이것은 "나 이 Resource 다 썼으니 main에 돌려줄게"라는 의미입니다.

    3.4 채널 생성과 고루틴 시작
    main에서는 pending과 complete라는 두 개의 *Resource 채널을 생성합니다. 그리고 StateMonitor를 초기화하고 여러 개의 Poller 고루틴을 시작합니다.

    초기 작업을 시스템에 추가하기 위해, main은 별도의 고루틴에서 각 URL당 하나의 Resource를 pending 채널로 본냅니다. 이 별도 고루틴이 필요한 이유는 버퍼링되지 않은 채널의 전송과 수신이 동기적이기 때문입니다. 만약 main 고루틴에서 전송하고 Poller 수보다 URL 수가 많으면 데드락(deadlock)이 발생합니다 — 아직 complete에서 수신하지 않고 있기 때문입니다.

    3.5 Sleep과 메인 이벤트 루프
    Poller가 Resource를 다 사용하면 complete 채널로 본냅니다. main은 이 Resource들을 수신하여 Sleep() 메서드를 호출한 뒤 적절한 지연 후에 pending으로 다시 본냅니다. 각 수면은 별도의 고루틴에서 실행되어 병렬로 처리됩니다.

    어떤 단일 Resource 포인터도 동시에 pending이나 complete 중 하나에만 있을 수 있습니다. 이로써 Resource는 Poller에 의해 처리되거나 수면 중이거나 둘 중 하나일 뿐, 동시에 두 상태가 될 수 없습니다. 이렇게 우리는 통신을 통해 Resource 데이터를 공유합니다.

    3.6 StateMonitor
    StateMonitor는 updates 채널로부터 State 값을 받아 urlStatus라는 맵에 최신 상태를 기록합니다. 그리고 ticker.C 채널로부터 주기적인 신호를 받아 현재 상태를 로그로 출력합니다.

    이 고루틴이 urlStatus 데이터 구조를 소유하므로, 이 맵은 순차적으로만 접근됩니다. 이는 공유 맵에 대한 병렬 읽기/쓰기로 인해 발생할 수 있는 메모리 손상 문제를 방지합니다.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    4. 실전활용
    • 웹 서비스 헬스 체크(health check) 시스템 구축
    • 여러 워커(worker)가 작업 항목을 안전하게 공유하는 워커 풀 패턴
    • 고루틴 간 데이터 소유권 이전을 통한 뮤텍스 없는(lock-free) 동시성 설계
    • pipeline 패턴에서 각 단계(stage)가 채널을 통해 데이터를 주고받는 구조

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    5. 정리
    이 Codewalk는 Go의 동시성 프리미티브(primitives)를 사용하여 통신을 통해 메모리를 공유하는 간단한 예제를 탐구했습니다. 이것은 고루틴과 채널을 사용하여 표현력 있고 간결한 동시 프로그램을 작성하는 방법을 탐구하기 위한 출발점이 됩니다.

    핵심 메시지: 메모리를 공유하여 통신하지 말고, 통신하여 메모리를 공유하라(share memory by communicating)!

    이 게시물을..
    N
    0
    0
    • [Rust 공식문서 한국어 정리] ①. The Rust Programming Language (The Book)오뉴노노
    • [Go 공식문서 한국어 정리] ⑤6. Codewalk: 마르코프 체인 텍스트 생성오뉴노노
    • 0
      오뉴노노

    오뉴노노 님의 최근 글

    [Rust 공식문서 한국어 정리] ⑭. Rustlings 8 2026 05.30 [Rust 공식문서 한국어 정리] ⑬. The Unstable Book 6 2026 05.30 [Rust 공식문서 한국어 정리] ⑫. Rust Cookbook 6 2026 05.30 [Rust 공식문서 한국어 정리] ⑪. The Little Book of Rust Macros 3 2026 05.30 [Rust 공식문서 한국어 정리] ⑩. Rust Design Patterns 6 2026 05.30

    오뉴노노 님의 최근 댓글

    ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30
    글쓴이의 서명작성글 감추기 
    댓글 쓰기 에디터 사용하기 닫기
    • view_headline 목록
    • 14px
    • [Rust 공식문서 한국어 정리] ①. The Rust Programming Language (The Book)
    • [Go 공식문서 한국어 정리] ⑤6. Codewalk: 마르코프 체인 텍스트 생성
    • 목록
      view_headline
    × CLOSE
    전체 던파 5 뮤 18 천상비 프로젝트신루 5 아이온 18 어둠의전설 28 리니지2 7 크로노스 5 칼온라인 3 기타 306
    기본 (398) 제목 날짜 수정 조회 댓글 추천 비추
    분류 정렬 검색
    • 포인트 획득 공지
      4
      2026.04.24 - 19:48 4218 4
    • 링크 업로드 관련 공지
      7
      2026.03.25 - 21:56 4158 7
    • 인증메일 공지
      2
      2026.03.15 - 16:42 4070 2
    • 파일링크 및 인증메일 발송 관련 문의 안내
      8
      2026.03.14 - 22:03 4597 8
    • 포인트 게시판 안내
      2026.02.28 - 19:14 5394
    • 게임존 사이트 변경 사항 안내
      9
      2026.02.26 - 01:07 7139 9
    • 소스자료는 직접 올려주세요
      2017.06.06 - 16:16 828
    398
    기타
    피파온라인 3 클라이언트
    N
    lyw01234 7시간 전 14
    397
    기타
    [Rust 공식문서 한국어 정리] ⑭. Rustlings
    N
    오뉴노노 22시간 전 8
    396
    기타
    [Rust 공식문서 한국어 정리] ⑬. The Unstable Book
    N
    오뉴노노 22시간 전 6
    395
    기타
    [Rust 공식문서 한국어 정리] ⑫. Rust Cookbook
    N
    오뉴노노 22시간 전 6
    394
    기타
    [Rust 공식문서 한국어 정리] ⑪. The Little Book of Rust Macros
    N
    오뉴노노 22시간 전 3
    393
    기타
    [Rust 공식문서 한국어 정리] ⑩. Rust Design Patterns
    N
    오뉴노노 22시간 전 6
    392
    기타
    [Rust 공식문서 한국어 정리] ⑨. Rust API Guidelines
    N
    오뉴노노 22시간 전 7
    391
    기타
    [Rust 공식문서 한국어 정리] ⑧. The Rust Performance Book
    N
    오뉴노노 22시간 전 7
    390
    기타
    [Rust 공식문서 한국어 정리] ⑦. Asynchronous Programming in Rust
    N
    오뉴노노 22시간 전 4
    389
    기타
    [Rust 공식문서 한국어 정리] ⑥. The Rust Edition Guide
    N
    오뉴노노 22시간 전 7
    388
    기타
    [Rust 공식문서 한국어 정리] ⑤. The Cargo Book
    N
    오뉴노노 22시간 전 1
    387
    기타
    [Rust 공식문서 한국어 정리] ④. The Rustonomicon
    N
    오뉴노노 22시간 전
    386
    기타
    [Rust 공식문서 한국어 정리] ③. The Rust Reference
    N
    오뉴노노 22시간 전
    385
    기타
    [Rust 공식문서 한국어 정리] ②. Rust By Example
    N
    오뉴노노 22시간 전
    384
    기타
    [Rust 공식문서 한국어 정리] ①. The Rust Programming Language (The Book)
    N
    오뉴노노 22시간 전
    기타
    [Go 공식문서 한국어 정리] ⑤7. Codewalk: Share Memory By Communicating
    오뉴노노 2026.05.30 - 03:29 5
    382
    기타
    [Go 공식문서 한국어 정리] ⑤6. Codewalk: 마르코프 체인 텍스트 생성
    오뉴노노 2026.05.30 - 03:26 1
    381
    기타
    [Go 공식문서 한국어 정리] ⑤5. Codewalk: Go의 일급 함수
    오뉴노노 2026.05.30 - 03:25 1
    380
    기타
    [Go 공식문서 한국어 정리] ⑤4. Go 명령어 도구
    오뉴노노 2026.05.30 - 03:24 2
    379
    기타
    [Go 공식문서 한국어 정리] ⑤3. 통합 테스트 커버리지 프로파일링
    오뉴노노 2026.05.30 - 03:23 1
    378
    기타
    [Go 공식문서 한국어 정리] ⑤2. Go 레이스 디텍터 소개
    오뉴노노 2026.05.30 - 03:22 5
    377
    기타
    [Go 공식문서 한국어 정리] ⑤1. Go 모듈 게시하기
    오뉴노노 2026.05.30 - 03:21 8
    376
    기타
    [Go 공식문서 한국어 정리] ①50. Go 프로그램 프로파일링
    오뉴노노 2026.05.30 - 03:20 1
    375
    기타
    [Go 공식문서 한국어 정리] ①4⑨. 모듈 호환성 유지하기
    오뉴노노 2026.05.30 - 03:19 1
    374
    기타
    [Go 공식문서 한국어 정리] ①4⑧. Go Modules로 마이그레이션
    오뉴노노 2026.05.30 - 03:18 1
    373
    기타
    [Go 공식문서 한국어 정리] ①4⑦. 리플렉션의 법칙
    오뉴노노 2026.05.30 - 03:18
    372
    기타
    [Go 공식문서 한국어 정리] ①4⑥. JSON-RPC: 인터페이스 이야기
    오뉴노노 2026.05.30 - 02:46
    371
    기타
    [Go 공식문서 한국어 정리] ①4⑤. JSON과 Go
    오뉴노노 2026.05.30 - 02:45
    370
    기타
    [Go 공식문서 한국어 정리] ①4④. Go 선언 구문
    오뉴노노 2026.05.30 - 02:44
    369
    기타
    [Go 공식문서 한국어 정리] ①4③. Gob 데이터 인코딩
    오뉴노노 2026.05.30 - 02:43
    368
    기타
    [Go 공식문서 한국어 정리] ①4②. Go 슬라이스: 사용법과 낮부 구조
    오뉴노노 2026.05.30 - 02:42 1
    367
    기타
    [Go 공식문서 한국어 정리] ①4①. Go image/draw 패키지
    오뉴노노 2026.05.30 - 02:40
    366
    기타
    [Go 공식문서 한국어 정리] ③3⑩. Go 모뒬 참조
    오뉴노노 2026.05.30 - 02:35
    365
    기타
    [Go 공식문서 한국어 정리] ②38. Go 프로그래밍 언어 사양
    오뉴노노 2026.05.30 - 02:33
    364
    기타
    [Go 공식문서 한국어 정리] ⓮37. Go 동시성 패턴: Context
    오뉴노노 2026.05.30 - 02:29 1
    363
    기타
    [Go 공식문서 한국어 정리] ⑯36. Go의 오류 처리
    오뉴노노 2026.05.30 - 02:24
    362
    기타
    [Go 공식문서 한국어 정리] ⑯35. Go 모듈 사용하기
    오뉴노노 2026.05.30 - 02:21
    361
    기타
    [Go 공식문서 한국어 정리] ⑯34. Go 퍼집(Fuzzing)
    오뉴노노 2026.05.30 - 02:17
    360
    기타
    [Go 공식문서 한국어 정리] ⑯33. Go 제네릭스 시작하기
    오뉴노노 2026.05.30 - 02:14
    359
    기타
    [Go 공식문서 한국어 정리] ⑯32. Go 프로젝트에 기여하기
    오뉴노노 2026.05.30 - 02:12
    358
    기타
    [Go 공식문서 한국어 정리] ⑯31. Go 메모리 모델
    오뉴노노 2026.05.30 - 02:09
    357
    기타
    [Go 공식문서 한국어 정리] ⑯30. Go 코드 작성법
    오뉴노노 2026.05.30 - 02:06
    356
    기타
    [Go 공식문서 한국어 정리] ⑯29. Go 다운로드 및 설치
    오뉴노노 2026.05.30 - 02:03
    355
    기타
    [Go 공식문서 한국어 정리] ⑯28. Go 자주 물어보는 질문(FAQ)
    오뉴노노 2026.05.30 - 02:01
    354
    기타
    [Go 공식문서 한국어 정리] ⑯27. 효율적인 Go 프로그래밍
    오뉴노노 2026.05.30 - 01:58
    353
    기타
    [Go 공식문서 한국어 정리] ⑯26. Go 어셍리이터 빠른 가이드
    오뉴노노 2026.05.30 - 01:52
    352
    기타
    [Go 공식문서 한국어 정리] ⓪25. Go로 웹 애플리케이션 작성하기
    오뉴노노 2026.05.30 - 01:45
    351
    기타
    [Go 공식문서 한국어 정리] ⓪24. 데이터 레이스 디텍터 상세 가이드
    오뉴노노 2026.05.30 - 01:42
    350
    기타
    [Go 공식문서 한국어 정리] ⓪23. go 명령어 이해하기
    오뉴노노 2026.05.30 - 01:40 1
    349
    기타
    [Go 공식문서 한국어 정리] ⓪22. Go 공식 문서 가이드
    오뉴노노 2026.05.30 - 01:38
    • 1 2 3 4 5 6 7 .. 8
    • / 8 GO
  • GAMEZONE
 GAMEZONE all rights reserved.
by OrangeDay