OCaml - 执行 Lwt 线程的 Parmap 在执行时挂起

OCaml - Parmap executing Lwt threads hangs on the execution

这是对这个问题的跟进:

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

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)

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

中跟踪 I/Os

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

的回调中