close method

Future<void> close({
  1. Duration drain = const Duration(seconds: 30),
})

Stops every isolate, draining what each has in flight.

Implementation

Future<void> close({Duration drain = const Duration(seconds: 30)}) async {
  final stopped = <Future<void>>[];
  for (final handle in _handles) {
    final reply = ReceivePort();
    handle.send([drain.inMilliseconds, reply.sendPort]);
    stopped.add(reply.first.then((_) => reply.close()));
  }

  await Future.wait(stopped).timeout(
    drain + const Duration(seconds: 5),
    onTimeout: () => const <void>[],
  );
  for (final isolate in _isolates) {
    isolate.kill(priority: Isolate.immediate);
  }
  for (final worker in _workers) {
    worker.dispose();
  }
}