반응형
과거 파이썬에서 동시성이나 병렬 처리를 구현하려면 threading이나 multiprocessing 모듈을 직접 다루며 복잡한 스레드 생성, 락(Lock) 관리, 프로세스간 통신(IPC) 코드를 작성해야 했습니다. 이는 코드가 장황해지고 디버깅이 어려워지는 문제를 일으켰습니다.Python 3.2+에서 도입된 concurrent.futures 모듈과 3.4+의 asyncio는 이러한 문제를 완화하고, 더 직관적이고 Pythonic한 방식으로 동시성 작업을 처리할 수 있게 합니다.이번 글에서는 기존 접근법과 새로운 접근법을 비교하고, 각 방법의 장단점을 정리합니다.이전에는 어떻게 했을까?threading, multiprocessingimport threadingdef worker(): # 작업 처리 ..
과거 C++98/03 시절, 멀티스레딩을 구현하기 위해서는 운영체제별 API(pthread, Win32 threads 등)를 직접 호출하거나, Boost Threads와 같은 서드파티 라이브러리에 의존해야 했습니다. 이는 코드 이식성을 저하시켰고, 스레드 생성, 종료, 동기화 관리가 번거롭게 이루어지는 경우가 많았습니다.C++11 이후 표준 라이브러리에 std::thread, std::mutex, std::lock_guard, std::async 등 기본적인 멀티스레딩 기능이 도입되었고, C++20에서는 std::jthread와 중단 요청(stop token) 메커니즘이 추가되어 스레드 관리가 더 단순해졌습니다. 또한 C++20 코루틴(coroutine)을 활용하면 비동기 처리를 더 간결하고 직관적으로 ..
이번에 소개할 표현은 "Heisenbug"입니다. "Heisenbug"는 소프트웨어 테스트나 디버깅 과정에서 나타나는, 관측하기 어려운 특이한 버그를 가리키는 용어입니다. 이 버그는 물리학의 하이젠베르크 불확정성 원리(Heisenberg’s Uncertainty Principle)에서 이름을 따온 것으로, 관찰(또는 디버깅 도구를 사용)하려고 하면 증상이 사라지거나 달라져서 문제를 파악하기 힘든 버그를 의미합니다.1. 의미"Heisenbug"는 특정 조건에서만 발생하고, 디버깅이나 로깅을 강화하면 이상하게도 문제가 재현되지 않는 버그입니다. 즉, 관측 행위(코드 변경, 로그 추가, 디버거 접속) 자체가 버그의 상태에 영향을 미쳐, 원인을 파악하고 수정하기 더욱 까다로운 상황을 묘사합니다.예:"이 코드는 ..
이전 글에서는 러스트의 에러 처리 철학, Result와 Option, panic! 매크로를 통해 예외 없이 명시적으로 에러를 처리하는 방식을 살펴보았습니다. 이제는 러스트가 무엇보다 강력하게 내세우는 장점 중 하나인 동시성(Concurrency)과 병렬성(Parallelism) 지원에 대해 알아보겠습니다. C++도 C++11 이후 std::thread, std::mutex, std::atomic 등을 통해 멀티스레딩을 지원하지만, 여전히 개발자가 락(Lock) 관리나 데이터 경쟁(Race Condition), 댕글링 포인터 문제에 신경 써야 합니다. 반면 러스트는 언어 차원에서 안전성 보장을 강화하여, 고성능 병렬 코드를 작성하면서도 메모리 안전성과 데이터 경쟁 방지를 지원합니다.기본 스레드 사용하기러스..