onlineHandler: () => console.info('worker is online')
})
-pool.emitter.on(PoolEvents.ready, () => console.info('Pool is ready'))
-pool.emitter.on(PoolEvents.busy, () => console.info('Pool is busy'))
+pool.emitter?.on(PoolEvents.ready, () => console.info('Pool is ready'))
+pool.emitter?.on(PoolEvents.busy, () => console.info('Pool is busy'))
// or a dynamic worker_threads pool
const pool = new DynamicThreadPool(Math.floor(availableParallelism() / 2), availableParallelism(), './yourWorker.js', {
onlineHandler: () => console.info('worker is online')
})
-pool.emitter.on(PoolEvents.full, () => console.info('Pool is full'))
-pool.emitter.on(PoolEvents.ready, () => console.info('Pool is ready'))
-pool.emitter.on(PoolEvents.busy, () => console.info('Pool is busy'))
+pool.emitter?.on(PoolEvents.full, () => console.info('Pool is full'))
+pool.emitter?.on(PoolEvents.ready, () => console.info('Pool is ready'))
+pool.emitter?.on(PoolEvents.busy, () => console.info('Pool is busy'))
// the execute method signature is the same for both implementations,
// so you can easily switch from one to another
let poolFull = 0
let poolReady = 0
let poolBusy = 0
-pool.emitter.on(PoolEvents.full, () => poolFull++)
-pool.emitter.on(PoolEvents.ready, () => poolReady++)
-pool.emitter.on(PoolEvents.busy, () => poolBusy++)
+pool.emitter?.on(PoolEvents.full, () => poolFull++)
+pool.emitter?.on(PoolEvents.ready, () => poolReady++)
+pool.emitter?.on(PoolEvents.busy, () => poolBusy++)
let resolved = 0
const start = performance.now()
.then(() => {
resolved++
if (resolved === iterations) {
- console.info(`Time taken is ${performance.now() - start}`)
+ console.info(
+ `Time taken is ${(performance.now() - start).toFixed(2)}ms`
+ )
console.info(`The pool was full for ${poolFull} times`)
console.info(`The pool was ready for ${poolReady} times`)
- return console.info(`The pool was busy for ${poolBusy} times`)
+ console.info(`The pool was busy for ${poolBusy} times`)
+ return pool.destroy()
}
return null
})
})
let poolReady = 0
let poolBusy = 0
-pool.emitter.on(PoolEvents.ready, () => poolReady++)
-pool.emitter.on(PoolEvents.busy, () => poolBusy++)
+pool.emitter?.on(PoolEvents.ready, () => poolReady++)
+pool.emitter?.on(PoolEvents.busy, () => poolBusy++)
let resolved = 0
const start = performance.now()
.then(() => {
resolved++
if (resolved === iterations) {
- console.info(`Time taken is ${performance.now() - start}`)
+ console.info(
+ `Time taken is ${(performance.now() - start).toFixed(2)}ms`
+ )
console.info(`The pool was ready for ${poolReady} times`)
- return console.info(`The pool was busy for ${poolBusy} times`)
+ console.info(`The pool was busy for ${poolBusy} times`)
+ return pool.destroy()
}
return null
})
'use strict'
-const { isMainThread } = require('node:worker_threads')
const { ThreadWorker } = require('poolifier')
-const debug = false
-
function yourFunction () {
for (let i = 0; i <= 1000; i++) {
const o = {
}
JSON.stringify(o)
}
- debug === true && console.info(`This is the main thread ${isMainThread}`)
return { ok: 1 }
}
import express, { type Express, type Request, type Response } from 'express'
import type { WorkerData, WorkerResponse } from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class ExpressWorker extends ClusterWorker<WorkerData, WorkerResponse> {
private static server: Server
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return ExpressWorker.factorial(n - 1) * n
+ }
+
private static readonly startExpress = (
workerData?: WorkerData
): WorkerResponse => {
application.get('/api/factorial/:number', (req: Request, res: Response) => {
const { number } = req.params
- res.send({ number: factorial(parseInt(number)) }).end()
+ res.send({ number: ExpressWorker.factorial(parseInt(number)) }).end()
})
ExpressWorker.server = application.listen(port, () => {
type ThreadWorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends ThreadWorkerData<DataPayload>,
Response extends ThreadWorkerResponse<DataPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- data: { number: factorial(workerData?.data?.number as number) }
+ data: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.data?.number as number
+ )
+ }
} as unknown as Response
}
})
type WorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends WorkerData<BodyPayload>,
Response extends WorkerResponse<BodyPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial: (n: number) => number = n => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- body: { number: factorial(workerData?.body?.number as number) }
+ body: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.body?.number as number
+ )
+ }
} as unknown as Response
}
})
import Fastify, { type FastifyInstance } from 'fastify'
import type { WorkerData, WorkerResponse } from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class FastifyWorker extends ClusterWorker<WorkerData, WorkerResponse> {
private static fastify: FastifyInstance
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return FastifyWorker.factorial(n - 1) * n
+ }
+
private static readonly startFastify = async (
workerData?: WorkerData
): Promise<WorkerResponse> => {
Params: { number: number }
}>('/api/factorial/:number', request => {
const { number } = request.params
- return { number: factorial(number) }
+ return { number: FastifyWorker.factorial(number) }
})
await FastifyWorker.fastify.listen({ port })
type ThreadWorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends ThreadWorkerData<DataPayload>,
Response extends ThreadWorkerResponse<DataPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- data: { number: factorial(workerData?.data?.number as number) }
+ data: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.data?.number as number
+ )
+ }
} as unknown as Response
}
})
type WorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends WorkerData<BodyPayload>,
Response extends WorkerResponse<BodyPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial: (n: number) => number = n => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- body: { number: factorial(workerData?.body?.number as number) }
+ body: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.body?.number as number
+ )
+ }
} as unknown as Response
}
})
type WorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
private static wss: WebSocketServer
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return WebSocketServerWorker.factorial(n - 1) * n
+ }
+
private static readonly startWebSocketServer = (
workerData?: WorkerData
): WorkerResponse => {
ws.send(
JSON.stringify({
type: MessageType.factorial,
- data: { number: factorial(data.number as number) }
+ data: {
+ number: WebSocketServerWorker.factorial(data.number as number)
+ }
})
)
break
type ThreadWorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends ThreadWorkerData<DataPayload>,
Response extends ThreadWorkerResponse<DataPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- data: { number: factorial(workerData?.data?.number as number) }
+ data: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.data?.number as number
+ )
+ }
} as unknown as Response
}
})
type WorkerResponse
} from './types.js'
-const factorial: (n: number) => number = n => {
- if (n === 0) {
- return 1
- }
- return factorial(n - 1) * n
-}
-
class RequestHandlerWorker<
Data extends WorkerData<DataPayload>,
Response extends WorkerResponse<DataPayload>
> extends ThreadWorker<Data, Response> {
+ private static readonly factorial = (n: number): number => {
+ if (n === 0) {
+ return 1
+ }
+ return RequestHandlerWorker.factorial(n - 1) * n
+ }
+
public constructor () {
super({
echo: (workerData?: Data) => {
},
factorial: (workerData?: Data) => {
return {
- data: { number: factorial(workerData?.data?.number as number) }
+ data: {
+ number: RequestHandlerWorker.factorial(
+ workerData?.data?.number as number
+ )
+ }
} as unknown as Response
}
})