서버 방해 해제: NodeJS 협업 멀티태스킹

5503 단어 nodewebdevjavascript

TL; DR


  • 때때로 중요한 처리를 수행하는 코드를 노드에 작성해야 합니다
  • .
  • 종종 이를 별도의 프로세스로 분할할 수 있고 분할해야 하지만 항상 실용적인 것은 아닙니다
  • .
  • 기본 스레드가 사용 중이면 간단한 작업에도 서버가 완전히 응답하지 않습니다
  • .

  • js-coroutines 이제 노드에서 협업 멀티태스킹을 수행할 수 있으므로 하나 또는 두 개의 장기 실행 작업으로 인해 서버의 대화가 중단되지 않습니다.
  • js-coroutines는 MIT 라이선스에서 사용할 수 있으며 프런트 엔드 및 백엔드 JavaScript 및 TypeScript 프로젝트 모두에서 작동합니다
  • .

    노드 처리



    Node에서 상당한 처리가 필요할 수 있는 한 곳은 정보 캐시를 생성하거나 정기적으로 업데이트할 때입니다. 데이터 볼륨이 증가함에 따라 이 처리가 매우 번거로워질 수 있으며 이러한 작업이 진행되는 동안 서버가 정체되어 다른 요청에 응답하지 않습니다.

    현재 워크로드가 완료되는 동안 빠른 5ms 요청도 잠재적으로 몇 초 동안 차단됩니다.

    예를 들어 Run Big Job 버튼을 클릭하면 기본 스레드에서 요청이 차단되기 때문에 시간이 더 이상 업데이트되지 않습니다.



    이 예는 결과를 얻을 때마다 서버 시간에 대한 요청을 실행하는 것입니다. Run Big Job 버튼을 클릭하면 서버는 백만 개의 레코드 복사 및 정렬과 관련된 프로세스를 수행합니다.

    // This is the culprit 
    
    
    let test = Array.from({ length: 1000000 }, () => Math.random() * 1000)
    
    app.get("/bigjob", async (req, res) => {
        let copy = [...test]
        copy.sort()
        res.status(200).send("done")
    })
    


    코루틴



    코루틴을 사용하면 협업 멀티태스킹을 통해 시간이 지남에 따라 무거운 작업을 분할할 수 있습니다. js-coroutines에는 다양한 기본 기능이 포함되어 있으며 생성기 구문을 사용하여 직접 작성할 수 있습니다.

    이 경우 위의 코드를 다음과 같이 다시 작성할 수 있습니다.

    const { appendAsync, sortAsync } = require("js-coroutines")
    
    let test = Array.from({ length: 1000000 }, () => Math.random() * 1000)
    
    app.get("/bigjob", async (req, res) => {
        let copy = await appendAsync([], test)
        await sortAsync(copy)
        res.status(200).send("done")
    })
    


    아래 예에서 버튼을 클릭하면 시간이 계속 업데이트됩니다. 두 번 이상 클릭할 수도 있으며 준비가 되면 결과가 다시 표시됩니다(버튼 텍스트에 * 추가).



    이러한 모든 작업은 단일 스레드를 사용하므로 최대 성능을 위해 작업을 오프로드할 수 있는 여러 프로세서가 있는 경우 사용해서는 안 됩니다. 작업이 기본 스레드를 차단하지 않으려는 경우 매우 유용합니다. 처리 시간이 중요하지 않습니다.

    노드 지원



    노드 지원이 즉시 활성화되고 작업이 실행되는 데 최대 20ms가 허용된 다음 이벤트 루프가 실행됩니다.

    좋은 웹페이지 즐겨찾기