본문 바로가기
개발일기

[Node] native addon과 워커 스레드

by Nhahan 2023. 7. 2.

요약: 네이티브 애드온은 여러 스레드에서 동시 사용이 불가능하다.

 


 

Error: Module did not self-register

Error: Module did not self-register

 

스택 오버 플로우에서도 정답이 없고, 한글로 검색하면 비슷한 것도 안나왔다.

깃헙 이슈에도 딱히 답이 없었다.

단, 한가지 공통점은 대부분 워커 스레드와 연관해서 네이티브 애드온을 사용하려고 할 때 발생했다.

 

상황은 c++로 애드온 모듈을 만들고 컴파일 해서 .node 파일로 만든 뒤 이걸 워커 스레드에서 가져다 쓰는 식이었다.

동시성 문제도 고려해야하고 단순히 노드의 내장 기능으로는 구현할 수 없는 기능이 있어서 .node로 함수를 하나 만들었는데, 두 워커 스레드에서 이 파일에 접근하려고 할 때 `Error: Module did not self-register`에러가 발생했다.

코드 문제인가 싶어 이리저리 지지고 볶고 했는데 메인스레드에 할당했을 때는 잘되는게 꼭 워커스레드에만 할당하면 안되는 거였다.

 

그래서 그냥 .node 파일을 하나 더 만들어서 워커 스레드에 각각 할당했더니 잘 돌아갔다.

 

이 애드온이 어떤 객체인지에 대한 명확한 용어는 없다고 한다. 아래는 AI에게 물어본 네이티브 애드온에 관한 설명이다.

 

애드온이 단순히 함수로만 간주되는 것이 아니라 복잡한 객체로 동작하는 이유 중 하나가, 애드온이 다중 스레드 환경에서 안전하게 동작하기 위한 구조와 동기화 메커니즘을 포함할 수 있기 때문입니다.

네이티브 애드온은 C++로 작성된 모듈이므로, 그 복잡한 객체는 C++에서 정의된 클래스 또는 구조체를 말합니다. 네이티브 애드온이 제공하는 복잡한 객체는 다음과 같은 특징을 가질 수 있습니다:

1. 애드온 클래스: 네이티브 애드온은 C++에서 클래스로 정의될 수 있습니다. 이 클래스는 애드온의 기능을 구현하고, JavaScript와 상호 작용하기 위한 인터페이스를 제공합니다. 애드온 클래스는 C++의 객체 지향 프로그래밍 원칙을 따라 구현되며, 클래스 멤버 변수와 멤버 함수를 포함할 수 있습니다.
2. 애드온 객체 인스턴스: 네이티브 애드온은 애드온 클래스의 인스턴스로서 동작합니다. 이 인스턴스는 애드온의 상태와 동작을 유지하고, JavaScript와의 상호 작용에 사용됩니다. 애드온 객체 인스턴스는 애드온의 메모리 할당과 해제, 데이터 저장 및 접근, 비동기 작업 처리 등의 기능을 수행할 수 있습니다.
3. 애드온 인터페이스: 네이티브 애드온은 JavaScript와의 상호 작용을 위한 인터페이스를 제공합니다. 이 인터페이스는 애드온이 JavaScript 코드에서 호출되거나 콜백으로 사용될 수 있는 함수, 이벤트 등을 정의합니다. 애드온 인터페이스는 JavaScript와 C++ 간의 데이터 전달 및 함수 호출을 관리하는 역할을 수행합니다.

네이티브 애드온이 복잡한 객체로 간주되는 이유는, C++에서 구현된 클래스와 객체를 통해 다양한 기능을 제공하고, JavaScript와의 상호 작용을 관리하기 위한 인터페이스를 제공하기 때문입니다. 그러나 네이티브 애드온의 구체적인 구조와 복잡성은 개발자가 설계하고 구현하는 내용에 따라 달라질 수 있습니다. 명확한 용어나 표준 용어는 있지 않으며, 네이티브 애드온의 구조는 해당 애드온을 작성하는 개발자에 따라 다양할 수 있습니다.

 

그냥 계속 물어봐도 '복잡한 객체'라고만 한다.

아무튼 함수는 아니고 동시에 접근이 불가능한 싱글톤 객체 그 정도로 이해했다. (또 정확히 그런건 아니라고...)

 


 

아래는 현재 제작중인 npm 라이브러리

https://www.npmjs.com/package/file-dispatcher

 

file-dispatcher

File Dispatcher is a high-performing Node.js library for file event monitoring and dispatching. It efficiently handles file creation or renaming events, providing real-time responses in both synchronous and asynchronous modes. Compact yet powerful, it's i.

www.npmjs.com

노드지만 멀티스레드를 활용하여 빠르게 파일을 읽어 이벤트를 발행하는 라이브러리이다. 

 

'개발일기' 카테고리의 다른 글

[Elixir] Elixir 프로젝트 생성 오류  (0) 2023.07.16
AES, CBC 그리고 IV  (0) 2023.07.06
개발의 세계관  (0) 2023.06.21
[Node] node로 크롤러 개발 이슈들 정리  (0) 2023.05.15
마이크로서비스 핵심 개념 6가지  (0) 2023.05.13

댓글