본문 바로가기

nodejs - 오픈소스

비동기 후크

비동기 후크

안정성 : 1- 실험적

소스 코드 : lib / async_hooks.js

 async_hooks모듈은 비동기 리소스를 추적하는 API를 제공합니다. 다음을 사용하여 액세스 할 수 있습니다.

const async_hooks = require('async_hooks');

술어

비동기 리소스는 연결된 콜백이있는 객체를 나타냅니다. 이 콜백은에서 'connection' 이벤트와 같이 여러 번 호출 net.createServer()되거나에서와 같이 한 번만 호출 될 수 있습니다 fs.open(). 콜백이 호출되기 전에 리소스를 닫을 수도 있습니다. AsyncHook이러한 다른 경우를 명시 적으로 구별하지는 않지만이를 자원 인 추상 개념으로 표현합니다.

경우 Worker의 사용하는 각 스레드는 독립적 인이 async_hooks 인터페이스를, 각 스레드는 비동기 ID의 새로운 세트를 사용합니다.

공용 API

개요

다음은 공용 API에 대한 간단한 개요입니다.

 

async_hooks.createHook(callbacks)

추가 : v8.1.0

  • callbacks <개체> 훅 콜백 등록
    • init <기능> init콜백 .
    • before <기능> before콜백 .
    • after <기능> after콜백 .
    • destroy <기능> destroy콜백 .
    • promiseResolve <기능> promiseResolve콜백 .
  • 반환 : <AsyncHook> 후크 비활성화 및 활성화에 사용되는 인스턴스

각 비동기 작업의 다른 수명 이벤트에 대해 호출 할 함수를 등록합니다.

콜백 init()/ before()/ after()/ destroy()는 리소스 수명 동안 각 비동기 이벤트에 대해 호출됩니다.

모든 콜백은 선택 사항입니다. 예를 들어 리소스 정리 만 추적 destroy해야하는 경우 콜백  전달하면됩니다. 에 전달 될 수있는 모든 기능의 세부 callbacks에 후크 콜백의 섹션을 참조하십시오.

 

오류 처리

어떤 경우 AsyncHook콜백 던져, 응용 프로그램이 스택 트레이스를 출력하고 프로그램을 종료합니다. 종료 경로는 포착되지 않은 예외의 경로를 따르지만 모든 'uncaughtException'리스너가 제거되어 프로세스가 강제 종료됩니다. 'exit'응용 프로그램이 실행되지 않는 콜백은 여전히 호출됩니다 --abort-on-uncaught-exception, 스택 추적은 코어 파일을 떠나, 인쇄 및 응용 프로그램이 종료 될 경우.

이 오류 처리 동작의 이유는 이러한 콜백이 객체 수명의 잠재적 인 휘발성 지점 (예 : 클래스 생성 및 소멸 중)에서 실행되기 때문입니다. 이 때문에 향후 의도하지 않은 중단을 방지하기 위해 프로세스를 신속하게 중단하는 것이 필요하다고 생각됩니다. 예외가 의도하지 않은 부작용없이 정상적인 제어 흐름을 따를 수 있도록 포괄적 인 분석을 수행하면 향후 변경 될 수 있습니다.

AsyncHooks 콜백에서 인쇄

콘솔에 인쇄하는 것은 비동기 작업이므로 console.log() AsyncHooks 콜백이 호출됩니다. console.log()따라서 AsyncHooks 콜백 함수 내에서 또는 유사한 비동기 작업을 사용 하면 무한 재귀가 발생합니다. 디버깅 할 때 이에 대한 쉬운 해결책은 .NET Framework와 같은 동기 로깅 작업을 사용하는 것 fs.writeFileSync(file, msg, flag)입니다. 이것은 파일에 인쇄되며 동기식이기 때문에 AsyncHooks를 재귀 적으로 호출하지 않습니다.

 

const fs = require('fs'); const util = require('util'); function debug(...args) { // Use a function like this one when debugging inside an AsyncHooks callback fs.writeFileSync('log.out', `${util.format(...args)}\n`, { flag: 'a' }); }

 

로깅을 위해 비동기 작업이 필요한 경우 AsyncHooks 자체에서 제공 한 정보를 사용하여 비동기 작업의 원인을 추적 할 수 있습니다. 그런 다음 AsyncHooks 콜백을 호출 한 로깅 자체 인 경우 로깅을 건너 뛰어야합니다. 이렇게하면 무한 재귀가 끊어집니다.

수업: AsyncHook

이 클래스 AsyncHook는 비동기 작업의 수명 이벤트를 추적하기위한 인터페이스를 제공합니다.

asyncHook.enable()

  • 반환 값 : <AsyncHook> 에 대한 참조입니다 asyncHook.

주어진 AsyncHook인스턴스에 대한 콜백을 활성화합니다 . 콜백이 제공되지 않은 경우 활성화는 작동하지 않습니다.

AsyncHook인스턴스는 기본적으로 비활성화되어 있습니다. AsyncHook생성 직후 인스턴스를 활성화해야하는 경우 다음 패턴을 사용할 수 있습니다.