【发布时间】: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 服务器,但没有发生这样的事情。因此,您提供的原始问题的答案是正确的。如果您将其发布为答案,我会将其标记为正确的。