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
.
的回调中
这是对这个问题的跟进:
我正在尝试 运行 以下代码:
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
.
如果您将 thunk 或参数存储在列表 yolo
中,并延迟对 server_content2
的调用,以便它们在子进程中完成,则请求应该有效。为此,请确保调用发生在 Parmap.pariter
.