워커:스레드 분기

BABY CAT·2022년 10월 13일
0

node.js

목록 보기
7/18

참고
https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-workerthreads-%EB%AA%A8%EB%93%88#Worker_Thread_%EC%82%AC%EC%9A%A9

참고 (동기비동기블락넌블락) (코드포함)
https://hamait.tistory.com/930

//워커스레드모듈선언
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) { // 메인 스레드일 때
	const worker = new Worker(__filename); // 같은 dir폴더에 워커를 생성 
//워커클래스로 워커인스턴스선언 / 워커클래스에 스레드만드는 메소드실행

} else { // 워커스레드일 때
	// 위에서 생성한 worker는 여기서 동작
}
메인스레드는 if문 그대로 실행 :기존실행스레드
워커스레드는 else문 실행 :분기된스레드
메인 스레드 <-> Worker 데이터 송수신

if
worker.postMessage(' ') 로 부모에서 워커로 데이터를 보냄
else
parentPort.on('message')로 부모로부터 데이터를 받고, postMessage로 데이터를 보냄
parentPort.postMessage('pong');



1. 워커 코드 완성

const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) { // 메인 스레드
    const worker = new Worker(__filename); //워커 분기 > else문

    worker.on('message', (value) => { //메인스레드로실행 (아래아래'pong'이 value로
        console.log('워커로부터', value)
     //on:이벤트가발생하면 워커로부터~ 메세지보낸다 
      
    })
    worker.on('exit', (value) => { // parentPort.close()가 일어나면 이벤트 발생
        console.log('워커 끝~');
    })

    worker.postMessage('ping'); // 워커스레드에게 메세지를 보낸다.

} else { // 워커스레드

  //여기도 on - 이벤트발생시실행되는
    parentPort.on('message', (value) => {
        console.log("부모로부터", value);  //위에 'ping' 이 value로 들어가서 출력
        parentPort.postMessage('pong'); //메인스레드로 pong을 보냄 value로
        parentPort.close(); // 워커스레드 종료라고 메인스레드에 알려줘야 exit이벤트 발생       
      //parent:메인스레드를뜻함
    })
}









셋타임아웃에 딜레이를 걸 때
함수안에 있으면 함수가 끝나야 다음 함수가 실행이 된다
즉 블럭상태로 실행이 되는데 (딜레이시간동안 다음 코드를 실행하지 못하고 멈춘다)

워커를 사용하여 메인스레드는 바로 다음 코드로 넘어가고 
새로 분기된 워커스레드가 else에서 딜레이 코드를 받아서
논블럭을 구현
그리고 스레드가  분기되더라도 동시에 실행이 되는 것이 아니다.
한번에 스레드 중 하나만 실행이 된다   

프로세스=[스레드,스레드,스레드]
	스레드 간 정보전달 가능
    프로세스 간 정보전달 불가능

효율-빠른 과정을 판단해서 알아서 스레드 하나씩 실행한다
	한 프로세스는 한번에 한 코드 밖에 실행하지 못하기 때문

입출력 작업 시 생기는 딜레이를 워커-멀티스레드로 넌블락을 구현해서 속도를 높인다


입출력 작업이 없는 코드는 멀티스레드를 구현해도
속도가 빨라지지 않는다

2. 동기 / 비동기 : 블락 / 넌블락

넌블락킹 /  비동기
	 콜백함수의존재가비동기
     	콜백함수던져주고메인스레드는그대로진행하는중 콜백리턴이오면그대로받는다
블락킹 / 동기 

넌블락킹=비동기가 아니다

넌블락에 동기
그리고
블락에 비동기도 가능하다

동기 : 스레드1개 이상
비동기 : 스레드2개 이상
비동기는





ㄱ. 동기/비동기

  • 동기/비동기는 행위에 대한 이야기이다.

  • 여기서 "행위"는 단순히 서로 다른 쓰레드 or 프로세스 or  서버에서 일어나는 일련의 동작들 이라고 치환해서   생각하면 이해하기는 쉽다. 

  • 동시성(concurrent) 의 문제이지 병행성(parallel ) 과는 무관하다.



ㄴ. 블럭/논블럭 

  • 블럭/논블럭는 함수호출에서의 이야기이다.(기술적으로 명확히 구분된다.) \

  • A 라는 함수를 호출했을때,
    A라는 함수를 호출 했을 때 기대하는 행위를 모두 끝마칠때까지 기다렸다가 리턴되면,
    이것은 블로킹 되었다고 한다.

  • A 라는 함수를 호출 했는데,
    A라는 함수를 호출 했을 때 기대하는 어떤 행위를  요청 하고 "바로" 리턴되면
    이것은 논블럭킹 되었다고 한다.



A. 동기

  • A라는 행위와 B라는 행위가 순차적으로 작동한다면 동기라고 한다. 

  • 동기적 행동에는 하나가 더 있다.
    A라는 행위가 별개의 것이 아니라, B라는 행위를 관찰하는 행위라면
    이것이 동시에 일어나더라도 동기이다.

  • A라는 쓰레드와 B라는 쓰레드가 따로 돌아 간다고 해도, 어떤 하나의 행위가 다른 행위에 밀착되어 있다면 두 행위가 다른 쓰레드에서 벌어지더라도 동기란 말이다

3. 조합 (동기비동기블락넌블락)

ㄱ. 블럭/동기

A가 실행되다가 B라는 일을 수행하는 함수를 호출해서 B를 시작한다. B라는 일이 끝나면 함수를 리턴한다. A와 B는 순차적으로 진행되기 때문에 동기이며,  B라는 일을 하는 함수를 호출하고 그 일이 끝나고 나서야 리턴되므로 블럭된 것이다. 따라서 블럭/동기 

ㄴ. 논블럭/비동기

간단하다. A는 B의 일을 시작시키고 바로 리턴한다 (논블럭) 그리고 A와B는 각자 자신의 일을 한다 (비동기) 

ㄷ. ** 블럭/비동기

어떻게 블럭되었는데
A,B라는 일이 동시에 일어나는가?
설명을 들어보고 이런 경우를 말하는구나라는 "감"을 잡아보자.

일단 A는 B라는 일을 시킨다.
그리고 바로 리턴하고 (여기서는 논블럭) 
B는 일을 시작하고, A도 자신의 일을 한다. 

A는 중간에 B라는 일이 하는 중간 결과를 보고 받아서 처리해야한다.

A는 B에게 요청을 해서 중간결과를 기다린다(블록),
요청의 결과를 받고 나서 그 결과를 이용해서 A는 자신의 일을 처리한다.
동시에 B 는 또 자신의 일을 동시에 한다. (비동기) 

A는 다시 B에게 중간결과를 요청해서 기다린다 (블록),
요청의 결과를 받고 A는 자신의 일을 , B는 자신의 일을 한다. 반복된다.

이 글을 읽고, 사실 갸우뚱 해야한다. 중간에 블록되는 동안에는 "동기"
라고 말 할 수 있기 때문이다.

즉 어느 한 순간에 대해 해석하자면 틀릴 수도 있는것이다.
즉 처음부터 말해왔듯이 "정답"이 존재하지 않는다.
다만 이런 패턴들이 분명히 사용되고 있구나라고 감을 잡는게 목적이다.

ㄹ. ** 논블럭/동기

이것이 예도 위의 블럭/비동기와 비슷한데
조금 다른 늬앙스에 대해서 "감"을 잡아보자.

이것도 역시 A는 B라는 일을 시킨다.
바로 리턴한다. (논블럭) 

B는 일을 시작하는데, 
A는 자신의 일을 하지 않는다.
A의 하는 일이란 그저 B가 하는일을 확인하는 것이다.

B가 결과 보고(중간 보고가 아니다) 를 했는지를
확인하는 함수를 호출하고 ,바로 리턴한다(논블럭)

즉 결과 보고를 받을 때 까지 기다리는게 아니라, 결과 보고가 나왔는지
확인하고 바로 리턴하는 것이다.  이 짓을 계속한다.

즉 함수를 계속 논블럭으로 호출되긴 하나, A는 그저 B를 염탐할 뿐이다.
이 상태를 말한다.
그냥 염탐하지 말고 B가 일을 모두 끝마치고 리턴되길 기다리지 ;;;
(그냥 블럭/동기로 하는게 나은 상황이 연출된다) 

이후에 B가 결과보고를 하면,B는 자신의 일이 끝난 것이고
A는 이제서야 자신의 일을 처리하게 된다.
즉 순차적이라는 말이다. 따라서 (동기)

정리

동기(순차)
비동기(동시)

  • 넌블락.비동기: 스레드 2개 이상 동시실행

  • 넌블락.동기 : 스레드2개 이상 동시실행 중이라도 하나의 스레드가 다른 스레드를
    관찰하면서 리턴을 기다리는 것뿐이라면 실질적으론 동기 상태라고 할 수 있다

  • 블락.동기 : 스레드 1개 이상 순차 실행

  • 블락.비동기 : 스레드 2개 이상
    일시적으로만 블락.동기 상태인 경우

동기는 서로 메세지를 주고 받는 것, 기다리는 것
동기는 스레드 1개 이상
비동기는 서로 메세지를 주고 받지 않는 것
비동기는 스레드 2개 이상

0개의 댓글