Skip to content

Commit

Permalink
refactor(betterer 🔧): try to fix workers
Browse files Browse the repository at this point in the history
  • Loading branch information
phenomnomnominal committed Sep 9, 2024
1 parent 03c6601 commit 588de2f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
2 changes: 1 addition & 1 deletion packages/betterer/src/globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export async function createGlobals(
});
reporter = config.reporter;

const runWorkerPool = createRunWorkerPool(config.workers);
const runWorkerPool = await createRunWorkerPool(config.workers);
const results = new BettererResultsΩ(await resultsFile.parse());

setGlobals(config, results, runWorkerPool, testMetaLoader, versionControl);
Expand Down
4 changes: 2 additions & 2 deletions packages/betterer/src/run/run-worker-pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import type { BettererRunWorker } from './types.js';

import { createWorkerPoolΔ, importWorkerΔ } from '@betterer/worker';

export function createRunWorkerPool(workers: number): BettererWorkerPool<BettererRunWorker> {
return createWorkerPoolΔ(workers, async () => await importWorkerΔ('./run.worker.js'));
export async function createRunWorkerPool(workers: number): Promise<BettererWorkerPool<BettererRunWorker>> {
return await createWorkerPoolΔ(workers, async () => await importWorkerΔ('./run.worker.js'));
}
27 changes: 17 additions & 10 deletions packages/worker/src/worker-pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,17 @@ class BettererWorkerHandleΩ<API extends BettererWorkerAPI<unknown>> implements
private _destroyed = false;
private _free = Promise.resolve();
private _release: (() => void) | null = null;
private _worker: API | null = null;

constructor(private _workerFactory: BettererWorkerFactory<API>) {}
private constructor(private _worker: API) {}

public static async create<API extends BettererWorkerAPI<unknown>>(workerFactory: BettererWorkerFactory<API>) {
return new BettererWorkerHandleΩ(await workerFactory());
}

public async claim(): Promise<API> {
if (this._destroyed) {
throw new BettererError(`Handle has been destroyed so cannot be claimed. ❌`);
}
this._worker ??= await this._workerFactory();
await this._free;
this._free = new Promise<void>((resolve) => {
this._release = resolve;
Expand All @@ -27,7 +29,7 @@ class BettererWorkerHandleΩ<API extends BettererWorkerAPI<unknown>> implements
return;
}
this._destroyed = true;
await this._worker?.destroy();
await this._worker.destroy();
}

public release(): void {
Expand All @@ -40,10 +42,15 @@ class BettererWorkerHandleΩ<API extends BettererWorkerAPI<unknown>> implements

class BettererRunWorkerPoolΩ<API extends BettererWorkerAPI<unknown>> implements BettererWorkerPool<API> {
private _handleIndex = 0;
private _handles: Array<BettererWorkerHandle<API>>;

constructor(workerCount: number, workerFactory: BettererWorkerFactory<API>) {
this._handles = Array.from({ length: workerCount }).map(() => new BettererWorkerHandleΩ<API>(workerFactory));
constructor(private _handles: Array<BettererWorkerHandle<API>>) {}

public static async create<API extends BettererWorkerAPI<unknown>>(
workerCount: number,
workerFactory: BettererWorkerFactory<API>
) {
const handles = await Promise.all(Array.from({ length: workerCount }).map(() => BettererWorkerHandleΩ.create<API>(workerFactory)))
return new BettererRunWorkerPoolΩ(handles);
}

public async destroy(): Promise<void> {
Expand Down Expand Up @@ -72,9 +79,9 @@ class BettererRunWorkerPoolΩ<API extends BettererWorkerAPI<unknown>> implements
* @param workerFactory - A factory function which returns an instance of the specific Worker.
* The factory should call `importWorker__` with a path to the Worker file.
*/
export function createWorkerPoolΔ<API extends BettererWorkerAPI<unknown>>(
export async function createWorkerPoolΔ<API extends BettererWorkerAPI<unknown>>(
workerCount: number,
workerFactory: BettererWorkerFactory<API>
): BettererWorkerPool<API> {
return new BettererRunWorkerPoolΩ(workerCount, workerFactory);
): Promise<BettererWorkerPool<API>> {
return await BettererRunWorkerPoolΩ.create(workerCount, workerFactory);
}

0 comments on commit 588de2f

Please sign in to comment.