Skip to content

Commit cfc7243

Browse files
addiiotnal multidomain test
1 parent dbe6815 commit cfc7243

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

test/multidomain/domainworkers.ml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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 ()

test/multidomain/dune

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
(tests
2-
(names basic)
2+
(names basic domainworkers)
33
(libraries lwt lwt.unix))

0 commit comments

Comments
 (0)