An opinionated, unsafe set of bindings to Node's worker_threads
API.
Use workerbees
to distribute work over multiple actual threads instead of
that fiber bullshit Aff
gives you.
Also, there's has an Aff
-based API that makes it even more convenient.
Start by creating a worker module:
module Worker where
import Prelude
import Effect (Effect)
import Node.WorkerBees as Worker
main :: Effect Unit
main = Worker.makeAsMain (Worker.lift doSomethingReallyExpensive)
where
doSomethingReallyExpensive :: Int -> String
doSomethingReallyExpensive = ???
Then bundle your worker with spago
:
spago bundle --bundle-type app --module Worker --outfile worker.js --platform node
Write your main module:
import Prelude
import Data.Array as Array
import Effect (Effect)
import Effect.Aff as Aff
import Effect.Class.Console as Console
import Node.WorkerBees (Worker)
import Node.WorkerBees as Worker
import Node.WorkerBees.Aff.Pool as WorkerPool
main :: Effect Unit
main = Aff.launchAff_ do
let
worker :: Worker Unit
worker = Worker.unsafeWorkerFromPath "./worker.js"
-- Distributes work over 4 threads.
res <- WorkerPool.poolTraverse worker unit 4 (Array.range 1 100)
Console.logShow res
Run your main module:
spago run