OCaml - Parmap, выполняющий потоки Lwt, зависает при выполнении - PullRequest
0 голосов
/ 22 марта 2020

Это продолжение этого вопроса: Как синхронно выполнить поток 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)

1 Ответ

1 голос
/ 25 марта 2020

Проблема в том, что вызовы server_content2, которые запускают запросы, происходят в родительском процессе. Затем код пытается завершить их sh в дочерних процессах, порожденных Parmap. Lwt ломается здесь: он, как правило, не может отслеживать операции ввода-вывода через fork.

Если вы сохраняете thunks или аргументы в списке yolo и задерживает вызовы на server_content2 чтобы они выполнялись в дочерних процессах, запросы должны работать. Для этого убедитесь, что вызовы происходят в режиме обратного вызова Parmap.pariter.

...