问题标签 [ocaml-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.

0 投票
1 回答
164 浏览

ocaml - 如何使用 Lwt_pool

我想要一个具有最大连接数的 Redis 数据库连接池。看起来Lwt_pool是我正在寻找的解决方案,但我不太了解它应该如何工作。例如,我有一些问题:

  • 文档谈到Lwt_pool重用打开的连接非常好,但是池如何知道哪些连接可重用?据我所知,没有特定的方式来表示这一点,API 只提供了use方法。

  • 有没有比Lwt文档更好的资源来了解它是如何工作的?我无法轻易找到代码示例或许多可用资源。

0 投票
1 回答
530 浏览

ocaml - 正确使用 Lwt_main.run()

我在使用时遇到了一些错误Lwt_main.run()。基本上我有两个类型的无限循环,unit -> 'a Lwt.t = <fun>当我启动两个循环时,我收到错误。我在一个循环是编写器循环而另一个是读取器循环的上下文中使用这些。基本上,我必须更频繁地使用编写器更新一些数据,而不是使用阅读器。我收到的错误可以用下面的代码说明。

我可以按如下方式运行 Lwt_main.run 语句而不会出错,但似乎此解决方案只是用通配符掩盖警告,而不是修复警告。

在这种情况下正确使用什么,Lwt_main.run()以便我可以修复错误,而不仅仅是用通配符掩盖它们?

0 投票
1 回答
322 浏览

unix - OCaml Unix 错误

我遇到了一个我不知道如何调试的错误。错误是Exception: (Unix.Unix_error "Too many open files" pipe "")。我没有打开任何文件,只打开了一个 Unix 进程。有人对如何调试这个有一些提示吗?

导致错误的函数是:

whereactive_orders ()是一个从服务器获取 JSON 数据的函数。

0 投票
2 回答
451 浏览

ocaml - Lwt 和递归函数

可以使用 Lwt.return 作为递归函数中的最终调用吗?

我有一个编译得很好但运行不正常的函数,它看起来像f下面的函数。请假设g本示例中提供的任何功能都没有问题,我基本上只是想找出具有以下形式的功能是否可以,或者是否有更好/更简单(并且符合 Lwt)的方式执行以下操作:

我很确定我做错了。但是我使用的实际功能比这个例子复杂得多,所以我很难调试它。

0 投票
3 回答
655 浏览

stream - ocaml 中的流真的被使用了吗?

查看不同的 ocaml 项目,我没有看到使用过的语言的内置 Streams。即使在最近的Real World Ocaml书中,也根本没有提到 Streams,这很奇怪。

这是什么原因?是因为 Lwt 或 Core 取代了它们吗?

0 投票
1 回答
219 浏览

ocaml - 如何使用 Lwt 从特定目录正确启动进程

使用Lwt函数很容易从特定目录启动进程Sys.getpwdLwt_unix.chdir并且Lwt_process.exec

  1. 用于Sys.getpwd保存当前工作目录
  2. 用于Lwt_unix.chdir切换到特定目录
  3. 用于Lwt_process.exec启动外部进程
  4. 用于Lwt_unix.chdir切换到保存的当前工作目录

这个逻辑是有缺陷的,因为它允许调度程序在第一次调用Lwt_unix.chdir之后和调用之后运行另一个线程,Lwt_process.exec这将导致该线程在特殊目录中运行,而不是在保存的当前目录中运行。是否可以使用Lwt从特殊目录轻松启动进程,而无需引入我所描述的竞争条件?

0 投票
1 回答
162 浏览

ocaml - Lwt.backtrace_* 函数

我刚刚注意到 Lwt.mli 中的以下函数:

不幸的是,它们是无证的。他们在做什么?

0 投票
1 回答
167 浏览

ocaml - 如何在 Labltk 中使用 Lwt?

如何使用 Lwt 编写程序并与 Tk 接口交互。我试图在 Lwt 抢占线程中运行 Tk 主线程

wheremain构造接口并运行一个线程来更新它。这最终导致程序崩溃并出现致命错误(无法创建小部件),然后是核心转储。

一起使用 Lwt 和 Labltk 的正确方法是什么?

0 投票
1 回答
986 浏览

unit-testing - OCaml 使用 Async 编写超时函数

我正在尝试编写一个尝试评估函数的函数,但在特定超时后停止。

我尝试使用Deferred.any,它返回一个延迟,当底层延迟之一被履行时,它被履行。

我不确定如何从延迟的 monad 中提取值,所以我编写了一个函数“wait_for”,它会一直旋转直到确定基础值。

这没有用。在阅读了 Real World OCaml 的 Async 章节后,我意识到我需要启动调度程序。但是我不确定我会Schedule.go在哪里调用我的代码。我看不到该类型go : ?raise_unhandled_exn:bool -> unit -> Core.Std.never_returns适合您实际希望异步代码返回的代码的位置。文档说“异步程序在被调用go之前不会退出。”shutdown

我开始怀疑我对这个问题采取了完全错误的方法,直到我在康奈尔网站上找到了与同一问题非常相似的解决方案

无论如何,我不太确定我的使用wait_for是否正确。有没有一种规范的方法可以从延迟的单子中提取一个值?另外我如何启动调度程序?

更新:我尝试仅使用Core.Std.Threadand编写超时函数Core.Std.Mutex

我认为这非常接近工作。它适用于类似的计算let rec loop x = print_string ".\n"; loop x,但不适用于类似的计算let rec loop x = loop x。我认为现在的问题是,如果计算f ()无限循环,那么它的线程永远不会被抢占,所以其他线程都不会注意到超时已经过期。如果线程像打印字符串一样执行 IO,那么线程确实会被抢占。另外我不知道如何杀死一个线程,我在Core.Std.Thread的文档中找不到这样的函数

0 投票
2 回答
289 浏览

ocaml - Lwt 泄漏文件描述符,不确定是错误还是我的代码

(交叉发布到 lwt github 问题)

我已经将我的用法归结为这个代码示例,它会泄漏文件描述符。

说你有:

然后你创建一个简单的服务器:

nc -l 2001

然后让我们启动 OCaml 代码 utop example.ml

然后打开一个客户端

然后使用 lsof 查看端口 2000 的连接,我们看到

事实上,对于 的每次使用nc localhost 2000,我们都会CLOSE_WAIT从 lsof 使用中得到一个剩余的记录。

最终这将导致系统用尽文件描述符,这不会让程序崩溃,但会导致 Lwt 挂起。

我不知道我做错了什么,或者这是一个真正的错误,无论如何这对我来说是一个严重的错误,我在 10 小时内用完了文件描述符......

编辑:在我看来,问题在于连接的一侧已关闭,但另一侧未关闭,我原以为with_connection只要任一侧关闭,也就是无论何时关闭,都应该清理/nc_ic关闭nc_oc

编辑二:我已经尝试了所有手动关闭描述符的方式Lwt_io.close,但我仍然有 CLOSE_WAIT 消息。

编辑三:甚至Lwt_unix.close在给 with_connection 的可选fd参数的原始 fd 上使用类似的坏结果。

编辑四:最阴险的是,如果我使用Lwt_daemon.daemonize,那么这个问题似乎就消失了