1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
///
/// This example demonstrates how to use the worker pool to run multiple workers in parallel.
///
use rustyscript::{
worker::{DefaultWorker, DefaultWorkerQuery, WorkerPool},
Error, Module,
};
fn main() -> Result<(), Error> {
// We first will create a worker pool with 4 workers
let mut pool = WorkerPool::<DefaultWorker>::new(Default::default(), 4)?;
// We will now create a module that will perform a long running operation
// We will run this in parallel on two workers to demonstrate the worker pool
let module = Module::new(
"test.js",
"
// Perform a long running operation
for (let i = 0; i < 10000000000; i++) {
// Do nothing
}
",
);
//
// Start the operation on the first worker
println!("Start load on A...");
let worker_a = pool.next_worker();
let query = DefaultWorkerQuery::LoadModule(module.clone());
worker_a.borrow().send(query)?; // We don't need to wait for the response right away!
//
// Start the operation on the second worker
println!("Start load on B...");
let worker_b = pool.next_worker();
let query = DefaultWorkerQuery::LoadModule(module.clone());
worker_b.borrow().send(query)?; // We don't need to wait for the response here either
//
// We can now wait for the responses
print!("Waiting for the workers to finish... ");
worker_a.borrow().receive()?;
print!("Done A... ");
worker_b.borrow().receive()?;
println!("Done B!");
Ok(())
}