并行计算斐波那契数
前置条件
这个示例使用了如下的包:
- wasmedge-sys v0.7.0
- wasmedge-types v0.1.1
概述
在这个例子中,我们将演示如何使用 wasmedge-sys 中定义的对象和 API 来并行地计算斐波那契数。
示例
在下面的代码中,我们创建了两个子线程,thread_a 和 thread_b,它们分别负责通过调用宿主函数 fib 来计算 Fib(4) 和 Fib(5)。之后,主线程通过将 thread_a 和 thread_b 返回的数字相加来计算 Fib(6)。
第一步:创建一个 Vm 上下文并注册 WebAssembly 模块。
1. ```rust
2. // create a Config context
3. let mut config = Config::create()?;
4. config.bulk_memory_operations(true);
6. // create a Store context
7. let mut store = Store::create()?;
9. // create a Vm context with the given Config and Store
10. let mut vm = Vm::create(Some(config), Some(&mut store))?;
12. // register a wasm module from a wasm file
13. let file = std::path::PathBuf::from(env!("WASMEDGE_DIR"))
14. .join("bindings/rust/wasmedge-sys/tests/data/fibonacci.wasm");
15. vm.register_wasm_from_file("extern", file)?;
16. ```
第二步:创建两个子线程,分别计算 Fib(4) 和 Fib(5)。
1. ```rust
2. let vm = Arc::new(Mutex::new(vm));
4. // compute fib(4) by a child thread
5. let vm_cloned = Arc::clone(&vm);
6. let handle_a = thread::spawn(move || {
7. let vm_child_thread = vm_cloned.lock().expect("fail to lock vm");
8. let returns = vm_child_thread
9. .run_registered_function("extern", "fib", [Value::from_i32(4)])
10. .expect("fail to compute fib(4)");
12. let fib4 = returns[0].to_i32();
13. println!("fib(4) by child thread: {}", fib4);
15. fib4
16. });
18. // compute fib(5) by a child thread
19. let vm_cloned = Arc::clone(&vm);
20. let handle_b = thread::spawn(move || {
21. let vm_child_thread = vm_cloned.lock().expect("fail to lock vm");
22. let returns = vm_child_thread
23. .run_registered_function("extern", "fib", [Value::from_i32(5)])
24. .expect("fail to compute fib(5)");
26. let fib5 = returns[0].to_i32();
27. println!("fib(5) by child thread: {}", fib5);
29. fib5
30. });
32. ```
第三步:从两个子线程中获取返回值,计算 Fib(6)。
1. ```Rust
2. let fib4 = handle_a.join().unwrap();
3. let fib5 = handle_b.join().unwrap();
5. // compute fib(6)
6. println!("fib(6) = fib(5) + fib(1) = {}", fib5 + fib4);
7. ```
上述代码的最终结果将会像下面这样被打印在屏幕上。
1. fib(4) by child thread: 5
2. fib(5) by child thread: 8
3. fib(6) = fib(5) + fib(1) = 13
这个演示的完整源代码可以在 WasmEdge Github 找到。
