|
@@ -0,0 +1,127 @@
|
|
|
+
|
|
|
+alias uint8 = ubyte;
|
|
|
+
|
|
|
+import std.stdio;
|
|
|
+import std.concurrency : receive, receiveOnly, receiveTimeout, send, spawn, thisTid, Tid;
|
|
|
+import core.time : Duration, dur;
|
|
|
+import core.thread : Thread;
|
|
|
+
|
|
|
+Tid worker_ticker;
|
|
|
+Tid[4] workers_tids;
|
|
|
+
|
|
|
+
|
|
|
+struct Msg1{
|
|
|
+ uint8 command;
|
|
|
+}
|
|
|
+
|
|
|
+struct Msg2{
|
|
|
+ Tid sender;
|
|
|
+ string client_id;
|
|
|
+}
|
|
|
+
|
|
|
+struct Msg21{
|
|
|
+ uint8 command;
|
|
|
+ string client_id;
|
|
|
+}
|
|
|
+
|
|
|
+struct Msg3{
|
|
|
+ Tid sender;
|
|
|
+ uint8 command;
|
|
|
+ string client_id;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void test3_worker(uint8 n){
|
|
|
+ writeln("started worker = ", n);
|
|
|
+ bool go_work = true;
|
|
|
+
|
|
|
+ // https://dlang.org/phobos/std_concurrency.html#.receive
|
|
|
+ while(go_work){
|
|
|
+ //Thread.sleep(dur!"seconds"(120));
|
|
|
+ receive(
|
|
|
+ (Msg1 m) => writeln("got Msg1: command = ", m.command),
|
|
|
+ (Msg2 m){ writeln("got Msg2: from ", m.sender, ", client_id = ", m.client_id); send(m.sender, "Msg2 = ok"); },
|
|
|
+ (Msg21 m) => writeln("got Msg21: command = ", m.command, ", client_id = ", m.client_id),
|
|
|
+ (Msg3 m){ writeln("got Msg3: from ", m.sender, ", command ", m.command); send(m.sender, "Msg3 = ok"); go_work = false; }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ writeln("stopped worker = ", n); // unreachable
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void test3_ticker(){
|
|
|
+ writeln("started ticker");
|
|
|
+ bool go_work = true;
|
|
|
+ uint8 counter = 0;
|
|
|
+
|
|
|
+ while(go_work){
|
|
|
+ //receive(
|
|
|
+ receiveTimeout(dur!"seconds"(1),
|
|
|
+ (uint8 msg){ if(msg == 0){ writeln("ticker stop command received"); go_work = false; } }
|
|
|
+ );
|
|
|
+
|
|
|
+ counter += 1;
|
|
|
+ if(counter % 5 == 0){
|
|
|
+ counter = 0;
|
|
|
+ writeln("tick (5 seconds passed)");
|
|
|
+ }
|
|
|
+
|
|
|
+ Thread.sleep(dur!"seconds"(1));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void test3_spawner(){
|
|
|
+ worker_ticker = spawn(&test3_ticker);
|
|
|
+
|
|
|
+ uint8 i = 1;
|
|
|
+ workers_tids[0] = spawn(&test3_worker, i);
|
|
|
+ string answer;
|
|
|
+
|
|
|
+ //Thread.sleep(dur!"seconds"(30));
|
|
|
+ Thread.sleep(dur!"seconds"(3));
|
|
|
+
|
|
|
+ send(workers_tids[0], Msg1(42)); // async command ?
|
|
|
+
|
|
|
+ send(workers_tids[0], Msg2(thisTid, "client_123"));
|
|
|
+ answer = receiveOnly!string();
|
|
|
+ writeln("answer = ", answer);
|
|
|
+
|
|
|
+ send(workers_tids[0], Msg21(5, "client_456"));
|
|
|
+ send(workers_tids[0], Msg3(thisTid, 99, "client_789"));
|
|
|
+ answer = receiveOnly!string();
|
|
|
+ writeln("answer = ", answer);
|
|
|
+
|
|
|
+ Thread.sleep(dur!"seconds"(25));
|
|
|
+
|
|
|
+ uint8 stop_command = 0;
|
|
|
+ send(worker_ticker, stop_command); // send stop command for ticker worker
|
|
|
+
|
|
|
+ writeln("the end");
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+// message passing (sync + responce) + ticker with stop command + app ok stop
|
|
|
+
|
|
|
+> make run
|
|
|
+./vtest2
|
|
|
+started ticker
|
|
|
+started worker = 1
|
|
|
+got Msg1: command = 42
|
|
|
+got Msg2: from Tid(7ff9edfa48f0), client_id = client_123
|
|
|
+answer = Msg2 = ok
|
|
|
+got Msg21: command = 5, client_id = client_456
|
|
|
+got Msg3: from Tid(7ff9edfa48f0), command 99
|
|
|
+stopped worker = 1
|
|
|
+answer = Msg3 = ok
|
|
|
+tick (5 seconds passed)
|
|
|
+tick (5 seconds passed)
|
|
|
+the end
|
|
|
+ticker stop command received
|
|
|
+tick (5 seconds passed)
|
|
|
+hello here!
|
|
|
+
|
|
|
+*/
|
|
|
+
|