|
| 1 | +open Lwt.Syntax |
| 2 | + |
| 3 | +let rec worker recv_task f send_result = |
| 4 | + let* task = Lwt_stream.get recv_task in |
| 5 | + match task with |
| 6 | + | None -> |
| 7 | + let () = Printf.printf "worker(%d) received interrupt\n" (Domain.self () :> int); flush_all() in |
| 8 | + Lwt.return () |
| 9 | + | Some data -> |
| 10 | + let () = Printf.printf "worker(%d) received task (%S)\n" (Domain.self () :> int) data; flush_all() in |
| 11 | + let* result = f data in |
| 12 | + send_result (Some result); |
| 13 | + let () = Printf.printf "worker(%d) sent result (%d)\n" (Domain.self () :> int) result; flush_all() in |
| 14 | + let* () = Lwt.pause () in |
| 15 | + worker recv_task f send_result |
| 16 | + |
| 17 | +let spawn_domain_worker f = |
| 18 | + let recv_task, send_task = Lwt_stream.create () in |
| 19 | + let recv_result, send_result = Lwt_stream.create () in |
| 20 | + let dw = |
| 21 | + Domain.spawn (fun () -> |
| 22 | + Lwt_main.run ( |
| 23 | + let* () = Lwt.pause () in |
| 24 | + worker recv_task f send_result |
| 25 | + ) |
| 26 | + ) |
| 27 | + in |
| 28 | + send_task, dw, recv_result |
| 29 | + |
| 30 | +let simulate_work data = |
| 31 | + let simulated_work_duration = String.length data in |
| 32 | + let* () = Lwt_unix.sleep (0.01 *. float_of_int simulated_work_duration) in |
| 33 | + Lwt.return (String.length data) |
| 34 | + |
| 35 | +let main () = |
| 36 | + let send_task1, dw1, recv_result1 = spawn_domain_worker simulate_work in |
| 37 | + let send_task2, dw2, recv_result2 = spawn_domain_worker simulate_work in |
| 38 | + let l = |
| 39 | + Lwt_main.run ( |
| 40 | + let* () = Lwt.pause () in |
| 41 | + let* lengths = |
| 42 | + Lwt_list.mapi_p |
| 43 | + (fun idx s -> |
| 44 | + let* () = Lwt.pause () in |
| 45 | + if idx mod 3 = 0 then begin |
| 46 | + send_task1 (Some s); |
| 47 | + Lwt_stream.get recv_result1 |
| 48 | + end else begin |
| 49 | + send_task2 (Some s); |
| 50 | + Lwt_stream.get recv_result2 |
| 51 | + end) |
| 52 | + [""; "adsf"; "lkjh"; "lkjahsdflkjahdlfkjha"; "0"; ""; ""; ""; ""; ""; "adf"; "ASDSKJLHDAS"; "WPOQIEU"; "DSFALKHJ"; ""; ""; ""; ""; "SD"; "SD"; "SAD; SD;SD"; "ad"; "...."] |
| 53 | + in |
| 54 | + send_task1 None; |
| 55 | + send_task2 None; |
| 56 | + let lengths = List.filter_map Fun.id lengths in |
| 57 | + Lwt.return (List.fold_left (+) 0 lengths) |
| 58 | + ) |
| 59 | + in |
| 60 | + let () = Domain.join dw1 in |
| 61 | + let () = Domain.join dw2 in |
| 62 | + Printf.printf "total: %d\n" l; |
| 63 | + flush_all (); |
| 64 | + exit 0 |
| 65 | + |
| 66 | +let () = main () |
0 commit comments