threads.js icon indicating copy to clipboard operation
threads.js copied to clipboard

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

Open appocalypseltd opened this issue 2 years ago • 1 comments

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.

appocalypseltd avatar Feb 14 '23 16:02 appocalypseltd

try exposing only in a worker thread.

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

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

prassie avatar Aug 19 '23 16:08 prassie