andywer / threads.js

🧵 Make web workers & worker threads as simple as a function call.
https://threads.js.org/
MIT License
3.04k stars 161 forks source link

"Error: Cannot find module '/engine-learn/Worker'" or "Error: expose() called in the master thread." #465

Open appocalypseltd opened 1 year ago

appocalypseltd commented 1 year ago

My Nx setup using threads.js ain't working...I'm getting either this error:

Error: Cannot find module 'engine-learn/Worker'

...when my setup looks like this:

// index.ts
export * from './EngineLearn';

// Worker.ts
import { expose } from 'threads/worker';

const trainModel = async () => {
  console.log("In trainModel");
};

expose(trainModel);

// EngineLearn.ts
import { Pool, spawn, Worker } from 'threads';

export class EngineLearn {
  trainModels = async () => {
    console.log('Hello');
    const pool = Pool(() => spawn(new Worker('./Worker')));
  };
}

...or, if I export Worker.ts in my root index.ts, like this:

// index.ts
export * from './EngineLearn';
export * from './Worker';

...I get:

"Error: expose() called in the master thread."

It seems the module is not included in the build if I export it in index.ts, and so cannot be found; but, if I do, expose() is immediately invokes and it gives rise to the other error.

What to do 🤷🏻

I am using the @nrwl/esbuild:esbuild build executor.

prassie commented 1 year ago

try exposing only in a worker thread.

import { expose, isWorkerRuntime } from "threads/worker";

if (isWorkerRuntime()) {
  expose(trainModel);
}