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:如何通过流将数据从一个进程传递到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SecureString 从一个进程传递到另一个进程?