0

这是对这个问题的跟进: 如何同步执行 Lwt 线程

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

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)

4

1 回答 1

1

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

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

于 2020-03-25T09:08:02.573 回答