# multithreading

Node.js Worker threads 사용법
이 글에서는… Node.js의 worker threads를 사용하는 방법에 대해 알아본다. Worker threads란? Worker threads는 자바스크립트 코드를 parallel하게 돌릴 수 있도록 해주는 모듈로, 이전 Node 버전에서는 지원되지 않다가 Node v10부터 experimental feature로서, 그리고 Node v12부터는 stable하게 지원되기 시작했다. worker threads는 따로 npm 등으로 설치할 필요 없고, Node를 설치해 사용하고 있다면 아래와 같이 import하는 것만으로도 worker threads의 사용이 가능하다. 자바스크립트는 싱글 스레드? 어쩌면 여러분은 자바스크립트가 싱글 스레드라는 말을 들어본 적이 있었을지 모르겠다. 실제로, 자바스크립트는 웹페이지에서 발생하는 동시성 문제를 아예 없애버리기 위해 싱글 스레드로 구성되어 있다. 하지만, 우리가 오늘 실습

멀티스레딩을 활용한 고해상도 이미지의 고속 처리
몇몇 영상 처리 분야는 20Mpx(2천만화소) 이상의 고해상도 이미지를 다루게 된다. 이는 픽셀 단위의 순회가 필요할 경우 2천만회의 반복이 필요하다는 의미이다. (실제로는 RoI 를 사용하지만, 때때로 이미지 전역을 대상으로 검사가 필요한 경우도 있다.) 이에 더해 필터(or 마스크)라도 적용한다면 NxN배 반복문이 증가하게 된다. 24M(6K x 4K) 해상도의 이미지에 5x5 사이즈의 필터를 예시로 들자면 '6k x 4k x 5 x 5 = 6억'이라는 막대한 반복문을 순회하게 된다. 때문에 이러한 반복문 순회시간을 단축시키기 위해 멀티스레드를 도입하여 소요시간 단축을 기대할 수 있다. > (GPGPU를 활용하는 등 영상처리를 가속화 시키기 위한 다른 방법도 많지만 본 포스트에서는 CPU만으로 처리하는 경우를 다룬다.) 
[CS-OS] Multithreading #2 - Multithread & Multiprocess
(1) 멀티 스레드 한 개의 단일 어플리케이션(응용프로그램) -> 여러 스레드로 구성 후 작업 처리 시스템 자원 소모 감소(효율성), 처리량 증가(Cost 약간 감소) 통신 부담이 감소, 디버깅은 어렵다, 단일 프로세스에는 효과가 미약하다(좋은 성능의 cpu가 많이 나왔기 때문), 자원 공유 문제(교착 상태), 프로세스 영향을 준다. (2) 멀티 프로세스 한 개의 단일 어플리케이션(응용프로그램) -> 여렆로세스 구성 후 작업처리 한 개의 프로세스 문제 발생은 확산이 없다.(프로세스 kill) 캐시 체인지, Cost 비용이 매우 높다.(오버헤드 상승) 왜? 복잡한 통신 방식을 사용하기 때문이다. 멀티 스레드 VS 멀티 프로세스 멀티스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching 이 빠른 장점이 있지만, 동기화 문제와 하나아ㅢ 스레드 장애로 전체 스레드가 종료될 위험을 가지고 있다. 멀티

[CS-OS] Multithreading #1 - Process & Thread
멀티스레딩(Multithreading) >멀티스레딩(multithreading) 컴퓨터는 여러 개의 스레드를 효과적으로 실행할 수 있는 하드웨어 지원을 갖추고 있다. 이는 스레드가 모두 같은 주소 공간에서 동작하여 하나의 CPU 캐시 공유 집합과 하나의 변환 색인 버퍼 (TLB)만 있는 멀티프로세서 시스템 (멀티 코어 시스템)과는 구별한다. 그러므로 멀티스레딩은 프로그램 안에서 병렬 처리의 이점을 맛볼 수 있지만 멀티프로세싱 시스템은 여러 개의 프로그램들을 병렬로 처리할 수 있다. 멀티프로세싱 시스템이 여러 개의 완전한 처리 장치들을 포함하는 반면 멀티스레딩은 스레드 수준뿐 아니라 명령어 수준의 병렬 처리에까지 신경을 쓰면서 하나의 코어에 대한 이용성을 증가하는 것에 초점을 두고 있다. 위키백과-멀티스레딩 (1) 프로세스 >
[Python] boto3 multithreading
출처 https://stackoverflow.com/questions/52820971/is-boto3-client-thread-safe

[OS] Multi-Processing VS Multi-Threading
들어가기에 앞서 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다. 1. Multi-Processing 1) 개념 두개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것. (병렬처리) 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용한다. 2) 장점 독립된 구조로 안전성이 높은 장점이 있다. 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해정도는 생기지만 정지되거나 하는 문제는 발생하지 않는다. 여러개의 프로세스가 처리되어야 할 때 동일한 데이터를
[Dimelo Project] pm2 cluster mode session 공유 안되는 문제
https://velog.io/@suyeonpi/Dimelo-Project-nest.js-docker%EC%97%90-pm2-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 지난 내 글을 보면 pm2를 fork 모드가 아닌 cluster모드로 instance를 2개를 사용하여 서버를 돌렸다. 사실 fork, cluster 차이도 잘 모르고 cluster로 2개의 프로세스를 만들어서 서버의 부하를 막을 수 있겠구나(?!) 해서 2개의 instance로 만들었다. 하지만 뭔가 이상한 버그가 발생했다. 로그인을 분명 했는데 로그인한 유저 정보를 불러왔다가 안왔다가 랜덤하게 되었다. 현재 express-session을 이용해 브라우저 메모리에 세션을 보관하고 있었다. 혹시 설마 pm2 cluster가 2개라서 그런가? 해서 찾아봤더니 pm2 cluster mode는 stateless라는 것이다. 즉 세션 공유를 cluster간 할수 없다는 것이다. 이 상태
파이썬 멀티프로세싱 vs 멀티스레딩
https://monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html GIL(Global Interpreter Lock) 언어에서 자원을 보호하기 위해 락(Lock) 정책을 사용하고 그 방법 또한 다양하다. 파이썬에서는 하나의 프로세스 안에 모든 자원의 락(Lock)을 글로벌(Global)하게 관리함으로써 한번에 하나의 쓰레드만 자원을 컨트롤하여 동작하도록 한다. 위의 코드에서 result 라는 자원을 공유하는 두 개의 쓰레드를 동시에 실행시키지만, 결국 GIL 때문에 한번에 하나의 쓰레드만 계산을 실행하여 실행 시간이 비슷한 것이다. GIL 덕분에 자원 관리(예를 들어 가비지 컬렉팅)를 더 쉽게 구현할 수 있었지만, 지금처럼 멀티 코어가 당연한 시대에서는 조금 아쉬운 것이 사실이다. 그렇다고 파이썬의 쓰레드가 쓸모 없는 것은 아니다. GIL이 적용되는 것은 cpu 동작에서이

[python] #12. 파이썬으로 멀티쓰레딩 간단 구현
크롤링 연습을 하다보니 보통 웹사이트는 구현해놓은 그대로 응답을 하기 마련이다. 하지만 네이버나 카카오같은 대형포털은 접속할때마다 메인 배너나 상위 뉴스, 검색 순위 등 매번 달라진 모습을 보여주게 된다. 그래서... 100번 연속으로 크롤링이 하고싶어졌다. > 이렇게 무식하게 할 것 같지는 않았다. 그래도 비교를 위하여 네이버 메인 접속을 20번 연속으로 하면서 응답 html을 파일에 저장하는 기능이다. 쓰레드 풀의 선언 및 사용 쓰레드 풀은 가급적 본인의 컴퓨터 CPU 의 쓰레드 수만큼만 세팅한다. 세팅된 쓰레드 풀만큼 돌려서 순차적으로 코어에 무리를 줘가며 작업하다가 pool.join() 으로 작업이 끝남을 알린다. 왜 업체들이... 크롤링에 대한 고민이 끊이지 않는지 알 것 같다. 접속 차단될거 같아서 20번을 예로 들었는데 실제로 100번도 얼마 걸리지 않고 수행되었다. 웹사이트는 적당히 긁어가도록 하자. 차단당하

기본형 변수의 Setter, Getter 는 Thread Safe 한가? (어셈블리어로 분석하기)
멀티쓰레드 환경에서 기본 타입 변수의 Setter, Getter 간에 Thread-Safe함을 보장하기 위한 동기화가 필요할까? 필요하지 않을까? 이에 대한 답을 위해 먼저 동시성 문제가 왜 일어나는지 정확히 그 원리를 이해해 보자. 이를 위해 MFC 프레임워크 C++ 코드에서 8바이트 부호없는 정수(Long형)간의 복사 코드 한줄이 실제로 Intel CPU에 의해 어떻게 동작하는지 어셈블리 코드를 분석해 본다. (어셈블리 코드 확인 방법은 글 마지막에 기록함) 샘플 소스코드 8바이트 부호없는 정수간의 복사 코드 한줄을 작성한다. 컴파일 후 생성된 어셈블리 코드 어셈블리 코드 분석 고급 언어(C++)로 작성된 코드 한 줄은 실제로 CPU에 의해 하나의 명령어로 처리되는 것이 아님을 확인할 수 있다. 위 어셈블리 코드 4줄은 아래와 같은 의미를 가진다. newStatusLong의 하위 4바이트 영역에 있는 값을 eax라는 CPU

Delete API를 호출해도 파일이 삭제되지 않아요?
시작하며 대부분의 개발자들이 원하지 않는 파일이 삭제되어 패닉 상태에 빠진 경험 한 두번쯤 있을 것이다. 오늘은 그와 반대로 삭제하려는 파일이 삭제되지 않아 고생했던 나의 경험을 나누어 보려고 한다. 내가 경험한 문제 어느날 시스템 운용자로부터 연락을 받았다. "OOO 파일이 삭제되지 않고 계속해서 용량이 증가하고 있어요." 코드는 단편적으로 보았을 때 온데 삭제 코드를 넣어 두어서 반드시 파일이 삭제될 것만 같아 보였는데 삭제가 되지 않았다니 이상했다. 아래는 파일 처리를 담당하는, 별도의 쓰레드로 동작하는 문제 코드의 대략의 구조이다. 문제의 원인 코드를 분석해 보았더니 쓰레드 외부에서 TerminateThread() API를 통해 아무런 동기화 없이 위 쓰레드를 강제 종료시켜 버리고 있었다. 그래서 쓰레드 수행 중 파일이 열린 상태에서 쓰레드가 강제 종료되는 케이스가 매우 간헐적으로 일어 났고, 닫히지 않은 파일은 동일 프로세스

안전한 쓰레드 종료 코드 직접 만들기
아름답게(?) 작성되지 않은 레거시 프로그램을 유지보수하다 보면 쓰레드 종료를 안전하게 하지 않은 코드 패턴을 종종 발견한다. 이로 인해 생긴 교묘한 버그로 고생한 경험이 있어서 어떻게 쓰레드를 종료하는 것이 안전한 것인지 정리해 두려고 한다. 안전한 쓰레드 종료 조건 쓰레드를 안전하게 종료해 주기 위해서는 쓰레드 코드와 쓰레드를 종료해 주는 코드 양쪽 모두 잘 작성되어야 한다. Thread Code 쓰레드 코드는 아래의 3가지 조건을 항상 만족하도록 작성되어야 한다. 쓰레드는 어딘가에서 무한히 Blocking 되어 있는 코드가 없어야 한다. 쓰레드는 종료 신호를 주기적으로 체크하고 종료 신호 수신 시 종료될 수 있어야 한다. 쓰레드 종료 시, 할당한 자원을 정상적으로 해제해야 한다. Thread Terminator Thread Terminator 는 Thread 에게 실행 종료를 알리고(플래그 또는 이벤트 객체를 통해), 실제로

Python multithreading
코드1(스레드 1개) 코드1(스레드 2개) 비교 코드 결과 |thread 1개|thread 2개|multithread X |-|-|-| |4.46619987487793 seconds|4.254441976547241 seconds|8.859218835830688 seconds| 설명 threading.Thread() 메소드 > *if name == 'main': 안에서 실행해야 함. thread 객체 생성 > Thread(target=work, args=(arg, [[[args], args], ...]) |parameter|Description| |-|-| |target|스레드가 실행할 함수| |args|함수의 인자들| thread 시작 > th1.start() thread 실행이 완료될 때까지 기다림 > th1.join()