Rename functions and methods to not use prefix underscore (#86)
authorShinigami <chrissi92@hotmail.de>
Tue, 9 Feb 2021 09:57:51 +0000 (10:57 +0100)
committerGitHub <noreply@github.com>
Tue, 9 Feb 2021 09:57:51 +0000 (10:57 +0100)
* Rename functions and methods to not use prefix underscore

* Update changelog

* Add sentence

CHANGELOG.md
src/dynamic.ts
src/fixed.ts
src/workers.ts
tests/fixed.test.js

index cf61e7816c3cb4fb5ae3efd4904e5f1b3fe6da1a..8479f0429b42ef98a0bdcfd38917728cda09f576 100644 (file)
@@ -5,6 +5,39 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [2.0.0] - not released yet
+
+### Breaking Changes
+
+We changed some internal structures, but you shouldn't be too affected by them as these are internal changes.
+
+#### New `export` strategy
+
+```js
+// Before
+const DynamicThreadPool = require("poolifier/lib/dynamic");
+// After
+const { DynamicThreadPool } = require("poolifier/lib/dynamic");
+```
+
+But you should always prefer just using
+
+```js
+const { DynamicThreadPool } = require("poolifier");
+```
+
+#### Internal (protected) methods has renamed
+
+Those methods are not intended to be used from final users
+
+- `_chooseWorker` => `chooseWorker`
+- `_newWorker` => `newWorker`
+- `_execute` => `internalExecute`
+- `_chooseWorker` => `chooseWorker`
+- `_checkAlive` => `checkAlive`
+- `_run` => `run`
+- `_runAsync` => `runAsync`
+
 ## [1.1.0] - 2020-21-05
 
 ### Added
index ca6e4849016a44f005843dbc42e781f377ae30bf..09b9bedbb60ce90c13fa051b524dfb0d6ff9c41f 100644 (file)
@@ -44,7 +44,7 @@ export class DynamicThreadPool<
     this.emitter = new MyEmitter()
   }
 
-  protected _chooseWorker (): WorkerWithMessageChannel {
+  protected chooseWorker (): WorkerWithMessageChannel {
     let worker: WorkerWithMessageChannel | undefined
     for (const entry of this.tasks) {
       if (entry[1] === 0) {
@@ -59,10 +59,10 @@ export class DynamicThreadPool<
     } else {
       if (this.workers.length === this.max) {
         this.emitter.emit('FullPool')
-        return super._chooseWorker()
+        return super.chooseWorker()
       }
       // all workers are busy create a new worker
-      const worker = this._newWorker()
+      const worker = this.newWorker()
       worker.port2?.on('message', (message: { kill?: number }) => {
         if (message.kill) {
           worker.postMessage({ kill: 1 })
index 39ee595408be3c5ddf07d2d2419c1596628bc644..b499c26954e2076da0d84e8bf7b5081dfb5ba1a7 100644 (file)
@@ -2,9 +2,6 @@
 
 import { MessageChannel, SHARE_ENV, Worker, isMainThread } from 'worker_threads'
 
-function empty (): void {}
-const _void = {}
-
 export type Draft<T> = { -readonly [P in keyof T]?: T[P] }
 
 export type WorkerWithMessageChannel = Worker & Draft<MessageChannel>
@@ -50,7 +47,7 @@ export class FixedThreadPool<Data = any, Response = any> {
   >()
   /* eslint-enable @typescript-eslint/indent */
 
-  protected _id: number = 0
+  protected id: number = 0
 
   /**
    * @param numThreads Num of threads for this worker pool.
@@ -71,7 +68,7 @@ export class FixedThreadPool<Data = any, Response = any> {
     }
 
     for (let i = 1; i <= this.numThreads; i++) {
-      this._newWorker()
+      this.newWorker()
     }
   }
 
@@ -90,31 +87,31 @@ export class FixedThreadPool<Data = any, Response = any> {
   // eslint-disable-next-line @typescript-eslint/promise-function-async
   public execute (data: Data): Promise<Response> {
     // configure worker to handle message with the specified task
-    const worker = this._chooseWorker()
+    const worker = this.chooseWorker()
     const previousWorkerIndex = this.tasks.get(worker)
     if (previousWorkerIndex !== undefined) {
       this.tasks.set(worker, previousWorkerIndex + 1)
     } else {
       throw Error('Worker could not be found in tasks map')
     }
-    const id = ++this._id
-    const res = this._execute(worker, id)
-    worker.postMessage({ data: data || _void, _id: id })
+    const id = ++this.id
+    const res = this.internalExecute(worker, id)
+    worker.postMessage({ data: data || {}, id: id })
     return res
   }
 
   // eslint-disable-next-line @typescript-eslint/promise-function-async
-  protected _execute (
+  protected internalExecute (
     worker: WorkerWithMessageChannel,
     id: number
   ): Promise<Response> {
     return new Promise((resolve, reject) => {
       const listener = (message: {
-        _id: number
+        id: number
         error?: string
         data: Response
       }): void => {
-        if (message._id === id) {
+        if (message.id === id) {
           worker.port2?.removeListener('message', listener)
           const previousWorkerIndex = this.tasks.get(worker)
           if (previousWorkerIndex !== undefined) {
@@ -130,7 +127,7 @@ export class FixedThreadPool<Data = any, Response = any> {
     })
   }
 
-  protected _chooseWorker (): WorkerWithMessageChannel {
+  protected chooseWorker (): WorkerWithMessageChannel {
     if (this.workers.length - 1 === this.nextWorker) {
       this.nextWorker = 0
       return this.workers[this.nextWorker]
@@ -140,14 +137,14 @@ export class FixedThreadPool<Data = any, Response = any> {
     }
   }
 
-  protected _newWorker (): WorkerWithMessageChannel {
+  protected newWorker (): WorkerWithMessageChannel {
     const worker: WorkerWithMessageChannel = new Worker(this.filePath, {
       env: SHARE_ENV
     })
-    worker.on('error', this.opts.errorHandler ?? empty)
-    worker.on('online', this.opts.onlineHandler ?? empty)
+    worker.on('error', this.opts.errorHandler ?? (() => {}))
+    worker.on('online', this.opts.onlineHandler ?? (() => {}))
     // TODO handle properly when a thread exit
-    worker.on('exit', this.opts.exitHandler ?? empty)
+    worker.on('exit', this.opts.exitHandler ?? (() => {}))
     this.workers.push(worker)
     const { port1, port2 } = new MessageChannel()
     worker.postMessage({ parent: port1 }, [port1])
index ec03c07ec4460b833564e627cb925b249757f368..9ead4d47bc1e4b2d8545fcaa10f9c1b29b4840cf 100644 (file)
@@ -48,26 +48,26 @@ export class ThreadWorker<Data = any, Response = any> extends AsyncResource {
     // keep the worker active
     if (!isMainThread) {
       this.interval = setInterval(
-        this._checkAlive.bind(this),
+        this.checkAlive.bind(this),
         this.maxInactiveTime / 2
       )
-      this._checkAlive.bind(this)()
+      this.checkAlive.bind(this)()
     }
     parentPort?.on(
       'message',
       (value: {
         data?: Response
-        _id?: number
+        id?: number
         parent?: MessagePort
         kill?: number
       }) => {
-        if (value?.data && value._id) {
+        if (value?.data && value.id) {
           // here you will receive messages
           // console.log('This is the main thread ' + isMainThread)
           if (this.async) {
-            this.runInAsyncScope(this._runAsync.bind(this), this, fn, value)
+            this.runInAsyncScope(this.runAsync.bind(this), this, fn, value)
           } else {
-            this.runInAsyncScope(this._run.bind(this), this, fn, value)
+            this.runInAsyncScope(this.run.bind(this), this, fn, value)
           }
         } else if (value.parent) {
           // save the port to communicate with the main thread
@@ -82,37 +82,37 @@ export class ThreadWorker<Data = any, Response = any> extends AsyncResource {
     )
   }
 
-  protected _checkAlive (): void {
+  protected checkAlive (): void {
     if (Date.now() - this.lastTask > this.maxInactiveTime) {
       this.parent?.postMessage({ kill: 1 })
     }
   }
 
-  protected _run (
+  protected run (
     fn: (data: Data) => Response,
-    value: { readonly data: Data, readonly _id: number }
+    value: { readonly data: Data, readonly id: number }
   ): void {
     try {
       const res = fn(value.data)
-      this.parent?.postMessage({ data: res, _id: value._id })
+      this.parent?.postMessage({ data: res, id: value.id })
       this.lastTask = Date.now()
     } catch (e) {
-      this.parent?.postMessage({ error: e, _id: value._id })
+      this.parent?.postMessage({ error: e, id: value.id })
       this.lastTask = Date.now()
     }
   }
 
-  protected _runAsync (
+  protected runAsync (
     fn: (data: Data) => Promise<Response>,
-    value: { readonly data: Data, readonly _id: number }
+    value: { readonly data: Data, readonly id: number }
   ): void {
     fn(value.data)
       .then(res => {
-        this.parent?.postMessage({ data: res, _id: value._id })
+        this.parent?.postMessage({ data: res, id: value.id })
         this.lastTask = Date.now()
       })
       .catch(e => {
-        this.parent?.postMessage({ error: e, _id: value._id })
+        this.parent?.postMessage({ error: e, id: value.id })
         this.lastTask = Date.now()
       })
   }
index 12c705cccf6f6d506fbdf0eeaab6a3ee0b2e5bb8..b8f8726450b9b730484b6a61dc2f535414e6f8de 100644 (file)
@@ -17,7 +17,7 @@ describe('Fixed thread pool test suite ', () => {
   it('Choose worker round robin test', async () => {
     const results = new Set()
     for (let i = 0; i < numThreads; i++) {
-      results.add(pool._chooseWorker().threadId)
+      results.add(pool.chooseWorker().threadId)
     }
     expect(results.size).toBe(numThreads)
   })