我目前正在学习Lwt。我有兴趣使用异步进程来用 OCaml 例程替换一些 shell 例程。
让我们看一下简化的第一次尝试,其中通过组合两个正在运行的线程来创建过滤器cat
:
let filter_cat ()=
Lwt_process.pmap_lines ("cat", [| "cat" |])
let filter_t () =
Lwt_io.stdin
|> Lwt_io.read_lines
|> filter_cat ()
|> filter_cat ()
|> Lwt_io.write_lines Lwt_io.stdout
let () =
filter_t ()
|> Lwt_main.run
此过滤器以某种方式工作,但在其标准输入关闭而不是退出时挂起。如果我删除其中一个filter_cat
,它会按预期工作。
我猜我没有适当地组合这些过滤器,因此无法加入我开始的两个线程。组成这些过滤器的正确方法是什么,以便程序在读取后EOF
终止stdin
?
您可以在Github gist中找到该程序和BSD Owl Makefile 。