问题标签 [lwt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ocaml - 如何充分利用 lwt_pool?
我在检查和验证功能上苦苦挣扎,Lwt_pool.create
并在这里有一些问题。
首先,让我描述一下我的使用背景。
我希望用来Lwt_pool
管理数据库连接池。数据库MongoDB
和驱动是我自己做的(Mongo.ml
)。驱动程序实际上很简单,它只是Unix.file_descr
与 MongoDB 服务器的 TCP ( ) 连接,并与服务器发送请求/接收响应。
以上是创建的文档
所以这是我的问题:
从文档中,我了解 validate 是在使用它之前验证连接。
所以我的第一个问题是如何检查 Unix.file_descr 的可用性?我只知道为了检查,我通过它发送了一些东西,对吗?但是,如果我通过我的连接发送一些东西以进行检查,那么我想这会很紧急,而且我还是想通过 发送一些东西Lwt_pool.use
,为什么还要在使用前做类似的事情呢?
我的第二个问题是关于检查的。
所以check会在使用后使用。从文档中,我真的无法理解。check 是一个以 my_db_connection (在我的情况下)和 a (fun b -> unit) 作为参数的函数。谁来提供(fun b -> unit)?Lwt_pool 本身有这样的功能吗?还是我应该提供?那该怎么办?
谢谢
ocaml - 使用 Lwt_term 编译程序
我在 OCaml 中有以下代码:
当我尝试使用编译时
我收到以下错误:
我知道这与上面的问题无关,但是从 utop 我可以打开 Lwt 但我仍然无法打开 Lwt_term。我究竟做错了什么?
ocaml - 正确使用 Lwt_main.run()
我在使用时遇到了一些错误Lwt_main.run()
。基本上我有两个类型的无限循环,unit -> 'a Lwt.t = <fun>
当我启动两个循环时,我收到错误。我在一个循环是编写器循环而另一个是读取器循环的上下文中使用这些。基本上,我必须更频繁地使用编写器更新一些数据,而不是使用阅读器。我收到的错误可以用下面的代码说明。
我可以按如下方式运行 Lwt_main.run 语句而不会出错,但似乎此解决方案只是用通配符掩盖警告,而不是修复警告。
在这种情况下正确使用什么,Lwt_main.run()
以便我可以修复错误,而不仅仅是用通配符掩盖它们?
cassandra - Cassandra LWT 读取
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为真,这是否意味着读取作为 LWT 插入的行可以以 ANY 的一致性级别安全读取?
换句话说,我假设 LWT 插入是完全一致的,使得任何后续读取也完全一致,无论一致性级别如何?
asynchronous - 如何组合 Lwt 过滤器?
我目前正在学习Lwt。我有兴趣使用异步进程来用 OCaml 例程替换一些 shell 例程。
让我们看一下简化的第一次尝试,其中通过组合两个正在运行的线程来创建过滤器cat
:
此过滤器以某种方式工作,但在其标准输入关闭而不是退出时挂起。如果我删除其中一个filter_cat
,它会按预期工作。
我猜我没有适当地组合这些过滤器,因此无法加入我开始的两个线程。组成这些过滤器的正确方法是什么,以便程序在读取后EOF
终止stdin
?
您可以在Github gist中找到该程序和BSD Owl Makefile 。
macos - 使 OPAM 在 MacOS X 下与系统编译器一起工作
我正在尝试在 MacOS 下进行非常基本的 OPAM 安装。使用 macports 我安装了以下软件包:
- 奥帕姆@1.2.0
- ocaml-findlib @1.5.5
- ocaml-camlp4 @4.02.0.1_1
当我这样做时opam init
(不是以root身份,因为我只需要一个用户)。
opam switch
显示我正在使用系统编译器:
system C system 系统编译器 (4.02.1)
然后我尝试通过 opam 安装“lwt”,它中途失败并出现错误:
这是我的opam list
:
我注意到它有自己的 ocamlfind,而不是系统一。也许这就是导致错误的原因:
我在通过 OPAM 安装 OCAML 编译器和 CAMLP 之前尝试过,在这种情况下它可以工作,但让我感到困扰的是我有两个相同版本的编译器安装。如果可能,我宁愿使用系统 OCAML 编译器和 CAMLP。
ocaml - 为什么这个基于 Lwt 且看似并发的代码如此不一致
我正在尝试创建 Lwt 的并发示例并想出了这个小示例
编辑:要求 50GB 是:“但是这非常慢而且基本上没用。内部绑定是否需要以某种方式强制?”
编辑:我最初写过要求 50 GB,但它从未完成,现在我有一个不同的问题,要求 50 MB,执行几乎是瞬时的,并且 du -sh 只报告 80k 的目录大小。
编辑:我还尝试了显式关闭文件句柄的代码,结果相同。
我在OS X
最新版本并编译
ocamlfind ocamlopt -package lwt.unix main.ml -linkpkg -o Test
(我也试过/dev/random
,是的,我正在使用挂钟时间。)
ocaml - Ocaml Lwt - 多人游戏的一些实现
我将继续编写井字游戏服务器的简单实现(通过 telnet)。任务 - 玩家连接到服务器,在他们发送 START 后,服务器会寻找也输入 START 的伙伴,然后游戏开始。一段代码:
我对 Ocaml 完全陌生(尤其是 Lwt)。那么,能否请您给我一个建议,如何让玩家开始寻找另一个玩家?我是否应该使用带有所有时间迭代检查玩家状态的列表、等待第二个玩家输入 START 的高级函数(我不确定这是否可能)、Lwt 唤醒器、Lwt 广播、创建另一个 a' Lwt 至有2个Lwt.t玩家什么的?我不知道如何以最聪明的方式实现。非常感谢。
concurrency - Ocaml Lwl_mvar.take 不阻塞线程
我还在继续写一个简单的游戏服务器。由于这里的一条建议,我实现了 mvar 支持,希望它会在不包含至少 2 个玩家的情况下阻塞线程。但它不会等到我把任何数据放在那里。它总是返回睡眠 Lwt.t。首先,在这里我们接受连接并提供玩家进入START开始寻找合作伙伴:
似乎没问题,但是当我调用 Lwt_mvar.take waiting_players 它总是返回一些值,即使之前没有放任何东西并且线程没有被阻塞。这种奇怪的(对我来说)行为在例子中更好看:
如果“阻塞”意味着返回正是这样的睡眠对象,请告诉。以及如何制作一个循环,以最好的方式只返回“准备好的”对象?使用 Lwt.is_sleeping 是个好主意吗?非常感谢。
sockets - 重定向 Lwt 通道
我有一个在 Unix 套接字上运行的 ssh 服务,并且我有一个本地 TCP 服务器,我希望将它定向到 unix 套接字的通道。
基本上当我这样做时:
然后我的本地 TCP 服务器获取请求并将其通过管道传输到 Unix 套接字和 TCP 客户端,在本例中为 ssh,从 Unix 套接字获取回复。相关代码:
而这种作品。当我在命令行上调用 ssh 时它会“卡住”,但我知道我正在获取一些数据,因为对方的 ssh 标头是正确的,SSH-2.0-OpenSSH_6.7
. 我也让我的一方打印出初始 ssh 握手的更多部分,即我看到这个打印:
等,这似乎是正确的。我认为挂起的原因是因为我正在使用Lwt_io.read_line
所以我尝试了这个:
实际上效果更糟,它甚至没有打印出最初的握手。我还尝试了专用的{write,read}_into
... 功能,但成功有限。在 strace/dtruce 下运行,我看到的最终结果如下:
其中 6.9 是我的本地机器的 ssh,而 6.7 是 Unix 套接字后面的远程机器。对我来说似乎很奇怪的一件事是它是如何\r
被删除的,这会将读/写计数更改为 1。我不确定这是否是关键的区别。
理想情况下,我希望从 Lwt 中进行某种抽象,即只要此可读通道(TCP 套接字)上有可用数据,就将其直接写入可写通道(Unix 套接字),反之亦然。