Дарт: Как передавать данные из одного процесса в другой через потоки - PullRequest
1 голос
/ 15 января 2020

Мне нужна возможность запустить два процесса из dart, прочитать входные данные из первого процесса, управлять выходными данными в dart и затем отправить данные во второй процесс.

Примечание: в этом примере я заявляю два процесса, но в действительности мне может потребоваться создать конвейерную линию, включающую любое количество процессов.

Эти два процесса, вероятно, будут длительными (предположим, минуты), и выходные данные должны быть доступны, поскольку процессы обрабатывают данные (подумайте tail -f).

Чтобы повторно проинформировать последнюю точку, процесс может вывести большие объемы данных, чтобы данные не могли быть сохранены в памяти, поэтому был применен потоковый подход, который я попытался.

Я пробовал следующее, но у меня нет опыта работы с потоками, поэтому я даже не уверен, что я на правильном пути.

https://dartpad.dev/3ad46c7e28c80f6735a9ee350091d509

1 Ответ

1 голос
/ 15 января 2020

Вы можете использовать Stream.pipe :

import 'dart:convert';
import 'dart:io';

void main() async {
  var ls = await Process.start('ls', []);
  var head = await Process.start('head', ['-1']);

  ls.stdout
      .transform(utf8.decoder)
      .transform(const LineSplitter())
      .map((line) => '1: $line\n')
      .transform(utf8.encoder)
      .pipe(head.stdin)
      .catchError(
        (e) {
          // forget broken pipe after head process exit
        },
        test: (e) => e is SocketException && e.osError.message == 'Broken pipe',
      );

  await head.stdout.pipe(stdout);
}
...