Dart:如何通过流将数据从一个进程传递到另一个进程

Posted

技术标签:

【中文标题】Dart:如何通过流将数据从一个进程传递到另一个进程【英文标题】:Dart: How to pass data from one process to another via streams 【发布时间】:2020-01-15 07:26:37 【问题描述】:

我需要能够从 dart 启动两个进程,从第一个进程读取输入,在 dart 中操作输出,然后将数据发送到第二个进程。

注意:在这个例子中我陈述了两个进程,但实际上我可能需要创建一个涉及任意数量进程的管道。

这两个进程可能会长时间运行(假设几分钟),并且输出必须在进程处理数据时可用(想想 tail -f)。

为了强化最后一点,该过程可能会输出大量数据,因此数据无法存储在内存中,因此我尝试了流方法。

我尝试了以下方法,但我没有使用流媒体的经验,所以我什至不确定我是否走在正确的轨道上。

https://dartpad.dev/3ad46c7e28c80f6735a9ee350091d509

【问题讨论】:

【参考方案1】:

你可以使用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);

【讨论】:

它几乎可以工作了!如果我不将 \n 添加到映射中,它会很好,除了输出都在一行上。如果我添加 \n 我得到一个堆栈跟踪:写入失败(操作系统错误:损坏的管道,errno = 32),端口 = 0 #0 _NativeSocket.write (dart:io-patch/socket_patch.dart:789:34 ) #1 _RawSocket.write (dart:io-patch/socket_patch.dart:1442:15) #2 _Socket._write (dart:io-patch/socket_patch.dart:1862:19) #3 _SocketStreamConsumer.write (dart:io -patch/socket_patch.dart:1617:22) 我的 sn-p 在 linux 上工作。你用的是什么平台? 根据运行此代码的平台,您可能必须使用\n\r\n 我在 ubuntu 19.10 上运行。 由于您的目标进程是head,因此如果您没有换行符,它永远不会终止。如果您确实添加了换行符,它将在 10 行后停止并关闭其标准输入。然后,您将更多数据添加到已关闭的标准输入,因为 Dart 程序无法识别出口。这可以解释写操作中的“断管”错误。不过,我不知道如何检测到head.stdin 已关闭。

以上是关于Dart:如何通过流将数据从一个进程传递到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 将数据从一个进程传递到另一个进程?

如何将 SecureString 从一个进程传递到另一个进程?

如何实现从一个进程到另一个进程的即发即弃消息传递?

是否可以将变量从一个进程传递到另一个进程?

将数据从 Windows 挂钩传递到另一个进程的最佳方法是啥?

如何在颤动中将数据从一个小部件传递到另一个小部件?