【问题标题】:OCaml - Parmap executing Lwt threads hangs on the executionOCaml - 执行 Lwt 线程的 Parmap 挂起执行
【发布时间】:2020-03-22 18:10:15
【问题描述】:

这是对这个问题的跟进: How to synchronously execute an Lwt thread

我正在尝试运行以下代码:

open Lwt
open Cohttp_lwt_unix

let server_content2 x  =
    "in server content x" |> print_endline ;
    Client.get (Uri.of_string ("http://localhost:8080/"^x)) >>= fun (_, body) ->
        (Cohttp_lwt.Body.to_string body) >|= fun sc -> sc
        ;;
let reyolo () =
    List.init 10 (fun i -> server_content2 (string_of_int i) ) ;;
let par () = 
    let yolo = reyolo () in
    "in par" |> print_endline;
    Parmap.pariter 
        ~ncores:4 
        (fun p ->  "before run" |> print_endline ; "content:"^(Lwt_main.run p) |> print_endline  ; "after run" |> print_endline ) 
        (Parmap.L yolo);;

par ()

我预计这将执行 10 个远程连接。 我得到的是 par 函数 Lwt_main.run 在进行实际远程调用之前似乎卡住了。

我怀疑它可能有什么意义,但假设响应的服务器是用 python 制作的,看起来像这样:

import subprocess
from bottle import run, post, request, response, get, route

@route('/<path>',method = 'GET')
def process(path):
    print(path)
    return "yolo"

run(host='localhost', port=8080, debug=True)

【问题讨论】:

  • 我可以回答一个更简单的例子;我高度怀疑这是最小的。在其他更改中,您是否能够删除 Parmap 的使用,也许用 Unix.fork 代替它?还是什么都没有?
  • 我精简了这个例子。关于第二部分,Parmap 是这个问题的关键要素,因为我想将远程连接集成到已经使用 Parmap 的现有程序中。与为远程获取/发布(例如使用套接字)寻找/实施其他解决方案相比,摆脱 Parmap 需要更多的工作。
  • 我在这里要做的是通过在我的程序中创建几个本地模块并将 Parmap 的源代码复制到其中来内联 Parmap 的 source code。然后我会精简生成的组合程序,直到希望只剩下对fork 的调用。我还会尝试将 10 元素列表减少到 2 个甚至 1 个。不用担心,如果您查看 Parmap,如果内核数量少于扇出,它的行为会有所不同,这对如果没有必要,请消除。
  • 另外,熟悉 Parmap 的人可能能够直接回答这个问题,但我不得不听从这样的人 :)
  • @antron 经过更多测试后,我得出结论,挂起线程的第二个原因是由于服务器的不当行为。现在我正在使用用 c++ 制作的 JSON-RPC 服务器,但没有发生这样的事情。因此,您提供的原始问题的答案是正确的。如果您将其发布为答案,我会将其标记为正确的。

标签: ocaml ocaml-lwt


【解决方案1】:

问题在于对启动请求的server_content2 的调用发生在父进程中。然后代码尝试在Parmap 产生的子进程中完成它们。 Lwt 在这里中断:一般来说,它不能跨 fork 跟踪 I/O。

如果您将 thunk 或参数存储在列表 yolo 中,并延迟对 server_content2 的调用,以便它们在子进程中完成,则请求应该可以工作。为此,请确保调用发生在 Parmap.pariter 的回调中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多