2020. 7. 15. 21:56ㆍ개발/Go
요즘 python 의 async 개념을 보면서 별 생각 없었던 golang의 goroutine에 대해 다시 한번 더 생각하게 될 계기를 가질 수 있었다. goroutine이 병렬적 연산인 줄 알았지만 아니었던 것...! 근데 왜 이때까지 병렬인줄 알았나..?!!?!?!? 그럼 내가 여태까지 본 자료들은 무엇인가..?!?! 알고보니 엄청 간단한 것들이었다.
일단 asynchronous한 것과 parellel한 것의 차이점을 알아야 한다. 이건 내 방식대로 설명해보겠다. 다음과 같은 작업을 사람이 한다고 생각하자.
작업1
'golang'을 구글에서 검색
2초 대기
'python'을 구글에서 검색
2초 대기
끝
작업2
'golang'을 종이에 쓰기
2초 대기
'python'을 종이에 쓰기
2초 대기
끝
Synchronous하게 하는 것은 단순하다. 작업1이 마치고 나면 작업2를 마치는 것이다. 그렇다면 총 수행 시간은 다음과 같다.
'golang'을 구글에서 검색 시간 + 2초 + 'python'을 구글에서 검색 시간 + 2초 + 'golang'을 종이에 쓰는 시간 +2초 +'python'을 종이에 쓰는 시간 +2초
이렇게 걸릴 것이다. 그렇다면 Asynchronous한 작업 방식은 어떤 것인가? 다음 설명도 정확하진 않지만 대략적으로 적으면
작업 1의 'golang'을 구글에서 검색 -> 검색창에 'golang'을 침 -> 작업 2에서의 'golang'을 종이에 쓰기 -> 그 와중에 때가 되면 작업 1의 2초 대기.... 이런식으로 작업을 번갈아가며 하는 것이다. 이를 'context switching'이라 한다. 당연히 이러한 switching도 cost가 있다. 그렇다면 parellel은? 그냥 손이 4개 있어서 작업1과 작업2를 동시에 하는 것이다. 여기서 손에 해당하는 것이 cpu에서 행해지는 process들이다.
다시 golang으로 돌아가서, 그렇다면 goroutine은 무엇인가? goroutine 자체는 asynchronous한 작업 자체인 것은 맞다. 하지만 흔히들 설정하는
runtime.GOMAXPROCS(runtime.NUMCPU())
를 활용하면 해당 코드가 컴파일되는 기기의 활용할 수 있는 cpu를 모두 활용함으로써 각각의 go routine을 돌릴 수 있게 됨으로써 병렬 프로그래밍이 구현될 수 있는 것이다. ........................................................그러나!!! go 1.5 이상에서는 default가 최대 cpu를 활용할 수 있도록 되어있다고 한다ㅎㅎ
다음 자료들을 참조했다.
https://realpython.com/async-io-python/
Async IO in Python: A Complete Walkthrough – Real Python
This tutorial will give you a firm grasp of Python’s approach to async IO, which is a concurrent programming design that has received dedicated support in Python, evolving rapidly from Python 3.4 through 3.7 (and probably beyond).
realpython.com
https://brownbears.tistory.com/313
[Golang] 고루틴
개요 고루틴은 가벼운 스레드와 같은 것으로 현재 수행 흐름과 별개의 흐름을 만들어줍니다. "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행합니다. goroutine은 비동기
brownbears.tistory.com
'개발 > Go' 카테고리의 다른 글
20200706 go compiler && go viper (0) | 2020.07.07 |
---|---|
20200513 Golang 기초 (0) | 2020.05.13 |