2022年10月16日日曜日

Node.jsのワーカースレッド内でsharpを動かすときの注意点

 以前にNode.jsのワーカースレッドの話をしましたが、今回はこのワーカースレッドでエラーが出てハマった話です。

ことの起こり

ワーカースレッドを使ったシステムでこんなエラーが発生したという報告を受けました。ちなみにsharpはNode.jsの画像操作モジュールです。

Something went wrong installing the "sharp" module

Module did not self-register: '/.../sharp-linux-x64.node'.

いやワイの環境ではこんなエラー起きてないぞ、おまいの環境が特殊じゃねーのかと思って環境を確認したらWSLとのこと。

あーこれは特殊だわ。普通の環境では発生しないから無視するしかねーわー

念のため確認

・・・とは言っても、特殊な環境とはいえエラーを放置するのは精神衛生上よろしくないので念のため原因を確認してみることに。

エラーメッセージの後にこんな情報が出ていました。

Possible solutions:
- Using worker threads? See https://sharp.pixelplumbing.com/install#worker-threads

ふむふむ。このシステムでもワーカースレッドを使ってるから関係あるかもね、と思って指示されたURLを見てみたらこんな一文が飛び込んできました。

On some platforms, including glibc-based Linux, the main thread must call require('sharp') before worker threads are created.

ごめん、これ特殊じゃなくてごく一般的な環境だわ。Ubuntuとかも当てはまるやん。ていうかWSLもUbuntuベースやん。

解決方法

上の文章のとおり、メインスレッド側に

require('sharp')

と書くことでエラーは出なくなりました。

ES Modulesを使っている場合はこんな感じです。

import 'sharp'

注意事項

ワーカースレッド内でsharpを使っていなくても、モジュールをインポートしているだけでもこのエラーは発生します。

なんでワイの環境ではエラー出なかったん?

ワイはAlpine LinuxベースのDockerコンテナ内でシステムを動かしていて、Alpine Linuxはglibcベースではなくmuslベースだったので影響がなかったんじゃないかと推測しています。ごめん、ワイの環境の方が特殊だったね。

0 件のコメント:

コメントを投稿