问题标签 [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 回答
127 浏览

ocaml - 创建 GET/POST 服务 Ocsigen

我正在使用 构建一个应用程序Ocsigen,此应用程序不会连接到数据库,目标是将内容从主网站复制到此处。(我正在使用 curl 来获取请求)

所以我的问题是,我正在尝试与用户进行“登录”,并且我想构建一个服务来保存我的代码usernamepassword用户引入的。然后我可以使用usernamepassword向主网站发出 GET 请求。

我的问题只有一个,我尝试了很多方法来构建一个保存这两个字符串的服务,但我想不出办法。

我做了很多不同的尝试,最后一次我做了类似以下的事情:

基于 Ocsigen 在他们的网站上的一个例子,但我不工作......

我创建了一个表单,它成功地执行了我创建的服务,但该服务从来没有做我需要的事情。

对不起,如果我解释得很糟糕......知道如何解决这个问题吗?我走错路了?

谢谢!

PS:我也尝试从 Ocsigen-Start src 文件夹中编辑 Os_services.connect_service ,我想我必须对这种情况进行 Post Service ,但我还是没有做我想做的事。

0 投票
0 回答
80 浏览

ocaml - 多次调用 Lwt_process.pread_lines

我正在尝试使用 Lwt_process.pread_lines 来获取一些命令的输出。在我的 Lwt_main.run 中,我调用它一次,然后通过运行良好的 Lwt_stream.map 开始分别处理每一行输出。

但是,在那个处理中,如果我调用另一个 Lwt_process.pread_lines,它似乎被忽略了:

我不明白,我什至没有例外。我已经尝试过 pread_line 和 pread_lines,看起来 >>= 之后的任何内容都被忽略了。如果我使用 |> 虽然它会被调用,但我当然需要使用输出。

我已经阅读了文档,并查看了 Lwt_process 的来源,但我没有看到任何表明您不能随意调用它的任何信息,它似乎为每个进程创建了一个新管道,至少在输出上。当然,我的外部进程根本不使用标准输入,它只是对 df 命令的调用。我错过了什么吗?

我应该清楚:它没有挂起,程序确实完成得很好。它只是从不调用任何试图使用后面命令的结果的东西,第一个工作正常。

谢谢

0 投票
1 回答
113 浏览

ocaml - Cstruct 和 Lwt_bytes

据我所知,Lwt_bytes 似乎使用与 Cstruct 相同的类型(或者可能使用 cstruct 本身),但出于某种原因,我不能让它们两者一起工作:

字节不是完全相同的类型吗?我怎样才能做到这一点?为了方便 Cstruct.LE,我尝试使用 Cstruct 而不是 Lwt_bytes,这些字节似乎没有。谢谢

0 投票
0 回答
68 浏览

ocaml - ^C 进程正在执行 Lwt 读取

我正在开发一个使用Lwt_ioLwt_io.read_into_exactly和其他功能的小程序。这一切都很好,但是^C (sigint) 没有做任何事情,这迫使我每次测试它时都要杀死 -9,这有点烦人。

我应该做些什么来让它被^C正常杀死,也许将套接字设置为非阻塞或什么?

谢谢 !

0 投票
1 回答
79 浏览

ocaml - 在绑定线程链中将 ref 设置为 Lwt_io.read_line 的结果

我正在创建一个聊天服务器,并且我有一个处理登录的函数。存在一个名为 nick 的预设 ref 和一个预设输入流 imp。我的代码如下:

但是,这段代码给了我错误:

我知道以下代码确实有效:

简而言之,我不知道如何将 vars 分配给从线程获得的值。

0 投票
0 回答
181 浏览

ocaml - 创建聊天服务器

我正在使用 lwt 以 Ocaml 语言创建聊天服务器。我希望它能够做的是提示用户输入昵称,存储昵称,然后输出用户已加入聊天。

我已经尝试过实现自己的代码,如下所示。

结果应该是在运行程序时,会:

  • 打印欢迎信息到 outp,
  • 从 inp 读取昵称,
  • 将新值分配给 nr
  • 将 nr 添加到会话
  • 宣布用户已加入。

现在,它编译,但不输出任何东西。

0 投票
1 回答
139 浏览

ocaml - Ocaml Lwt 类型混淆

我很困惑为什么 Lwt 打印函数Lwt_io.print有类型 string -> unit Lwt.t 但是如果我运行Lwt_io.print "a" >>= fun () -> Lwt_io.print "b";;结果是打印“ab”并返回类型单位。

我想这将是一个类型错误,因为 Lwt_io.print 返回单位 Lwt.t 而不是单位。为什么调用线程的第二部分?

0 投票
1 回答
131 浏览

concurrency - 在 OCaml 中使用 Lwt 时如何进行循环中断

我正在编写代码来监视文件的内容。当程序到达文件末尾时,我希望它干净地终止。

但是,当读取文件并到达末尾时,程序并没有终止,它只是挂起,我必须用 Ctrl+c 转义。我不确定 bind 的幕后发生了什么,但我认为无论它在做什么,最终Lwt_io.readline ic都应该到达文件末尾并返回一个End_of_file异常,这可能会被传递给处理程序等。

如果我不得不猜测一个决议,我想也许在定义的最后一个绑定中>>=我会包括一些if检查。但我想,我会检查是否Lwt_io.read_line返回End_of_file,我认为应该由handler.

0 投票
2 回答
93 浏览

ocaml - Lwt 是否利用数据依赖来增加并行性

我正在尝试通过几个示例来弄清楚 lwt 具体在做什么:

如果我有:

这是否运行 f 然后 g,或者由于 y 不依赖于 x,它会并行运行吗?

0 投票
1 回答
74 浏览

ocaml - How to send multiple TCP messages and continue when one has succeeded

I'm writing some networking code currently and I need to send out a large number of messages and then wait for a single response.

Given that I have a function that returns the input and output channels for a socket I have:

My understanding of this is that pick should cancel any ongoing requests after it has a fulfilled promise in resps. The issue is that if any of those connections fails/is refused, an exception is raised Unix.ECONNREFUSED.

My question is what is the correct semantics to force Lwt.pick to ignore the exceptions?

Options I've thought of so far are to catch the exception explicity in the requests:

But I'm not sure under what conditions the Lwt.pick will view those promises are rejected?

Update: I'm now handling the errors with cancellable, unfulfillable promises:

This feels hacky but seems to work so far.