123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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!
- */
|