isolates_helper 0.4.3+1 isolates_helper: ^0.4.3+1 copied to clipboard
Creates multiple long-lived isolates to compute multiple functions; Supports Worker and WASM on the Web; Supports try-catch block
Isolates Helper #
-
Creates multiple long-lived isolates to compute multiple functions.
-
Supports
Worker
andWASM
on the Web. -
This package is based on the power of isolate_manager but can be used with multiple functions.
-
Support
try-catch
block.
Usage #
Define the number of isolates you want to live with concurrent
parameter.
void main() async {
// Create 3 isolates to solve the problems
final isolates = IsolatesHelper(concurrent: 3);
// Listen for the results from the stream.
isolates.stream.listen((result) {
if (result is double) {
print('Stream get addFuture: $result');
} else {
print('Stream get add: $result');
}
});
// Compute the values. The return type and parameter type will respect the type
// of the function.
final added = await isolates.compute(addFuture, [1.1, 2.2]);
print('add: 1.1 + 2.2 = $added');
// Multiple computations at the same time are allowed. It will be queued
// automatically.
for (int i = 0; i < 10; i++) {
isolates(add, [i, i]).then((value) async {
print('add: $i + $i = $value');
});
}
// Stop the IsolateHelper instance after 5 seconds
Timer(Duration(seconds: 5), () {
isolates.stop();
});
}
Future<double> addFuture(List<double> values) async {
return values[0] + values[1];
}
int add(List<int> values) {
return values[0] + values[1];
}
Here is the ways to use try-catch
block:
// Catch the error from the stream
isolates.stream.listen((result) {
print('Stream get add: $result');
}).onError((e) {
print('Error from stream: $e');
});
// Catch the error from the try-catch block
try {
await isolates.compute(addException, [1, 1]);
} catch (e) {
print('Error from try-catch: $e');
}
The first compute
will automatically wait for all isolates to started before doing the computation, if you want to wait for it manually, you can use:
await isolates.ensureStarted;
Or you can check if the current isolates are started or still in processing by using:
bool isStarted = isolates.isStarted;
You can restart all the isolates with:
await isolates.restart();
Remember to stop the isolates when you don't need it:
await isolates.stop();
Worker #
You need to do a little bit more works then using normal Isolate but don't worry, the below steps will help you to do it easily.
-
Step 1 Create a file named
worker.dart
:import 'package:isolates_helper/isolates_helper.dart'; main() { IsolatesHelper.workerFunction({ /* Mapping between your function as String and real `Function`. This function MUST NOT depends on any Flutter library. */ 'add': add, }); }
-
Step 2: Run
dart compile js worker.dart -o worker.js -O4
to compile Dart to JS (The flag-O4
is the obfuscated level of JS, the lowest value is-O0
and the highest value is-O4
) -
Step 3: Copy
worker.js
to the Web folder (the same folder withindex.html
). -
Step 4: Now you can add
worker
toworker
parameter like below:final isolates = IsolatesHelper( concurrent: 3, worker: 'worker', isDebug: true, );
-
Step 5 Here is the way to execute a Worker function
final result = await isolates( // Here is the normal function add, // Here is the normal params [2, 3], // Here is the name of the function that is mapped in the step 2 workerFunction: 'add', // [Optional] the normal params will be used if this value is null workerParams: [2, 3], );
Contributions #
If you encounter any problems or feel the library is missing a feature, feel free to open an issue. Pull requests are also welcome.
Donations #
If you like my work or the free stuff on this channel and want to say thanks, or encourage me to do more, you can buy me a coffee. Thank you so much!