Perform async work synchronously in Node.js using worker_threads
, or child_process
as fallback, with first-class TypeScript support.
# yarn
yarn add synckit
# npm
npm i synckit
worker_threads
is used by default for performance, if you have any problem with it, you can set env SYNCKIT_WORKER_THREADS=0
to disable it and fallback to previously child_process
solution, and please raise an issue here so that we can improve it.
// runner.js
import { createSyncFn } from 'synckit'
// the worker path must be absolute
const syncFn = createSyncFn(require.resolve('./worker'))
// do whatever you want, you will get the result synchronously!
const result = syncFn(...args)
// worker.js
import { runAsWorker } from 'synckit'
runAsWorker(async (...args) => {
// do expensive work
return result
})
You must make sure:
- if
worker_threads
is enabled (by default), theresult
is serialized byStructured Clone Algorithm
- if
child_process
is used, theresult
is serialized byJSON.stringify
SYNCKIT_WORKER_THREADS
: whether or not enableworker_threads
, it's enabled by default, set as0
to disableSYNCKIT_BUFFER_SIZE
:bufferSize
to createSharedArrayBuffer
forworker_threads
(default as1024
), ormaxBuffer
forchild_process
(no default)SYNCKIT_TIMEOUT
:timeout
for performing the async job (no default)
If you want to use ts-node
for worker file (a .ts
file), it is supported out of box!
If you want to use a custom tsconfig as project instead of default tsconfig.json
, use TS_NODE_PROJECT
env. Please view ts-node for more details.
If you want to integrate with tsconfig-paths, please view ts-node for more details.
It is about 20x faster than sync-threads
but 3x slower than native for reading the file content itself 1000 times during runtime, and 18x faster than sync-threads
but 4x slower than native for total time.
And it's almost same as deasync
but requires no native bindings or node-gyp
.
See benchmark for more details.
You can try it with running yarn benchmark
by yourself. Here is the benchmark source code.
Detailed changes for each release are documented in CHANGELOG.md.