topic난이도 · 약 25

Node · Python · Go 런타임 비교 — 동시성 모델 3종

이벤트 루프(Node) · GIL + async(Python) · 고루틴(Go) — 어울리는 문제가 다르다.

#Node.js#Python#Go#이벤트루프#GIL#고루틴
왜 배우는가

"어떤 언어로 백엔드?" 판단의 근거. 바이브코더는 대부분 Node.js 하나면 되지만, 왜 Go·Python·Rust가 따로 쓰이는지 알면 Claude의 언어 선택 조언을 이해할 수 있다.

런타임동시성 모델타입어울리는 문제대표 프레임워크
Node.js싱글 스레드 이벤트 루프 + libuvJS/TSI/O 집약, 실시간, 풀스택Express, Next.js, Nest
Deno/BunNode 호환 + 보안·TS 내장TS신규 Node 대체Hono, Elysia
PythonGIL + async/await + 멀티프로세스동적(타입힌트 가능)데이터·AI, 스크립트FastAPI, Django
Go고루틴 (경량 스레드) + 채널정적고동시성·네트워크·CLIGin, Echo
Rustasync + 소유권(메모리 안전)정적극한 성능, 시스템Axum, Actix
Java/Kotlin스레드풀 + Virtual Thread(21+)정적대기업·엔터프라이즈Spring Boot

Node.js의 이벤트 루프 복습(ch07-5 연장). JS 코드는 한 스레드에서 돌지만, libuv 스레드풀이 파일 I/O·DB·네트워크를 뒤에서 병렬 처리. 그래서 1만 동시 접속에도 메모리 경량(프로세스당 MB 단위).

javascript
// Node — I/O 집약 서버의 강자
import express from "express";
const app = express();

app.get("/api/user/:id", async (req, res) => {
  // 3개 DB 호출이 동시 진행 (스레드풀이 처리)
  const [user, posts, followers] = await Promise.all([
    db.users.findById(req.params.id),
    db.posts.findByUser(req.params.id),
    db.followers.count(req.params.id),
  ]);
  res.json({ user, posts, followers });
});

I/O 3개를 병렬로 돌리면 가장 느린 하나만큼만 기다림. Node가 I/O 서버에서 빠른 이유.

Python의 GIL(Global Interpreter Lock) — CPython은 한 시점에 한 스레드만 파이썬 바이트코드 실행. 즉 스레드 늘려도 CPU 집약 작업은 병렬 안 됨. 해법: multiprocessing(프로세스 분리) · async/await(I/O 동시성) · numpy/torch(C 영역에서 GIL 해제).

FastAPI는 "파이썬 Node" 같은 경험. 데이터·AI 파이프라인 붙일 때 최강.

Go의 고루틴(goroutine)경량 스레드 — OS 스레드가 아닌 런타임이 관리. 수백만 개 동시 실행 가능. `go fn()` 한 줄로 동시 작업. 채널(channel)로 안전하게 통신. Node보다 더 많은 동시성 필요할 때·CPU·네트워크가 둘 다 중요할 때 선택.

go
// Go — 고동시성의 대가
package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    urls := []string{"https://a", "https://b", "https://c"}

    for _, url := range urls {
        wg.Add(1)
        go func(u string) {   // 고루틴 — 병렬 실행
            defer wg.Done()
            resp, _ := http.Get(u)
            fmt.Println(u, resp.Status)
        }(url)
    }
    wg.Wait()
}

고루틴은 KB 단위 메모리로 뜨기 때문에 수만 개 동시 실행이 일상. 디스코드·Uber·Kubernetes가 Go로 쓰인 이유.

바이브코더 선택 가이드. 풀스택 웹 → Next.js(Node). 데이터·AI·스크립트 → Python(FastAPI). 초고동시성 API·CLI → Go. 극한 성능·안전 → Rust. 2026년 현재 90% 프로젝트는 Node·Python 둘 중 하나로 충분.

작업 유형최고 성능 대략 비교
I/O·네트워크 API 서버Go ≳ Rust ≳ Node ≳ Python
CPU 집약(이미지·암호 등)Rust ≳ Go ≳ Node(Worker) ≳ Python(numpy 없이 ×)
개발 속도Python ≳ Node ≳ Go ≳ Rust
팀 채용 난이도Node ≦ Python ≪ Go/Rust
실기 드릴 3문항
edit실기 드릴 · 단답형

Node.js가 싱글 스레드인데도 수천 동시 요청을 처리할 수 있는 근본 메커니즘은?

edit실기 드릴 · 단답형

Python에서 여러 스레드를 써도 CPU 집약 작업이 병렬화되지 않는 원인은?

edit실기 드릴 · 단답형

Go의 경량 스레드 단위의 이름은?