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://git.4dev.win/221V/dlang_book/src/master/book/13-параллельные-вычисления // 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! */