언어의 비동기에 관해 — Go, Python
언어의 비동기에 관해 동시성을 지원하기 위한 도구라고 생각하였고 그 외에 생각해본 경험이 없었습니다.
그러다보니 근래까지 주로 쓰던 Go, Python에 대해 한번 정리해 보는 것도 좋겠다 라는 생각이 들어 정리해봅니다.
Golang에서는 비동기를 지원하기 위한 방식으로 고루틴(Goroutine)을,
Python에서는 asyncio 라이브러리로 코루틴(Coroutine)을 지원합니다.
언제나 간단한 예제는 이해를 더 쉽게 만들어 줍니다.
Golang에서는 이런식으로 비동기를 사용합니다.
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello, world!")
}
func main() {
go sayHello()
time.Sleep(time.Second)
}
고루틴(Goroutine)이라는 경량 스레드를 사용하여 비동기 처리를 수행합니다.
장점으로는 고루틴은 아주 작은 메모리(초기 스택 크기가 약 2KB)를 사용하므로, 한 번에 수천 개의 고루틴을 실행하는 것이 가능합니다.
고루틴은 채널(Channel)을 통해 서로 통신하며, 이를 통해 동기화를 제공합니다.
Python에서는 이런식으로 비동기를 사용합니다.
import asyncio
async def say_hello():
await asyncio.sleep(1)
print('Hello, world!')
asyncio.run(say_hello())
asyncio 모듈을 통해 비동기 프로그래밍을 지원합니다.
asyncio는 코루틴(Coroutine)을 이용하여 비동기 I/O를 처리하고, 이벤트 루프를 통해 여러 비동기 작업을 동시에 수행할 수 있습니다.
사실 이렇게만 보면 그다지 와닿지 않으며,
오히려 고루틴(Goroutine)과 코루틴(Coroutine)등의 용어로 인해 헷갈리게 됩니다.
마지막 결론을 내기전에 헷갈리는 용어는 한번더 정리를 하는게 좋다 생각하는데요
고루틴(Goroutine)은 Go 언어에서 동시에 실행되는 함수를 의미합니다.
코루틴(Coroutine)은 컴퓨터 프로그램의 일반화된 서브루틴(subroutine)
또는 함수의 일종으로,
Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합) 2개가 합쳐진 단어로
함께 동작하며 규칙이 있는 일의 순서를 뜻합니다.
여러 진입점을 가지고 있어 프로그램 실행을 중지했다가
필요에 따라 다시 시작할 수 있는 특징을 가지고 있습니다.
결론입니다.
이둘을 본격적으로 비교하며 정리하면 이렇게 정리할 수 있습니다.
Go 언어의 비동기 처리는 고루틴과 채널을 통해 이루어지며,
이를 통해 매우 효율적인 동시성 프로그래밍이 가능합니다.
고루틴은 경량 스레드로,
메모리 사용량이 매우 작아 많은 수의
고루틴을 동시에 실행할 수 있습니다.
Python의 비동기 처리는 asyncio 모듈과 코루틴을 통해 이루어집니다.
이를 통해 비동기 I/O 작업을 효율적으로 처리할 수 있습니다.
그러나
Python의 코루틴은 Go의 고루틴보다 사용법이 약간 복잡하며,
GIL(Global Interpreter Lock)로 인해
CPU 바운드 작업의 동시성에는 제한이 있습니다.
Go 언어는 처음부터 동시성을 염두에 두고 설계되었으므로,
동시성 프로그래밍을 위한 기능이 언어 자체에 잘 통합되어 있습니다.
반면 Python의 asyncio는 비교적 최근에 추가된 기능이므로,
일부 구식 코드와의 호환성 문제가 있을 수 있습니다.
이상입니다. 감사합니다.