Я знаю, что потоки дротиков предоставляют довольно простой способ "отправлять" запросы работнику: -
import 'dart:async';
final sc = StreamController<int>();
Future<void> worker() async {
await for (final req in sc.stream) {
print("received request: $req");
await Future.delayed(Duration(seconds: 1));
}
}
void main() async {
worker();
sc.add(1);
sc.add(2);
}
Однако здесь не хватает способа отправки ответа,назад к клиентам от работника: -
Хотя это можно сделать, используя Completer
, вот так: -
import 'dart:async';
class Request {
final Completer completer;
final int value;
Request(this.value) : completer = Completer();
}
final sc = StreamController<Request>();
Future<void> worker() async {
await for (final req in sc.stream) {
await Future.delayed(Duration(seconds: 1));
print("received request: ${req.value}");
req.completer.complete(req.value * req.value);
}
}
void main() async {
worker();
var req = Request(1);
sc.add(req);
var res = await req.completer.future;
print("got response: $res");
req = Request(2);
sc.add(req);
res = await req.completer.future;
print("got response: $res");
}
Не могу не задаться вопросом, есть ли лучшее, болееидиоматический способ добиться этого.Может ли кто-нибудь более опытный помочь мне?
-
Зачем мне это?Я нахожу, что такая архитектура довольно хорошо "вписывается" в мой мозг.
Кроме того, эта модель позволяет мне невероятно легко гарантировать, что одновременно выполняется только одна задача.
Это оказывается необходимым в определенных сценариях, таких как запись в один файл изнесколько мест во всей кодовой базе для постановки в очередь запросов BLE GATT и т. д.