I am using "programming in D" to learn about D language. I wrote a simple program that spawns a worker and sends it a number to receive its square as a string. The worker 1 gets the number squares it and sends to worker 2 (a different function) to get casted as string which is returned to the worker 1 and thus it returns it to the main function call. I can write the whole thing in a single thread. I wrote it to understand about workers better. I used receive to get the worker 1 act as per the input. The program is as follows

import std.stdio;
import std.concurrency;
import std.conv;
import core.thread;

void main() {

  foreach (int num; 1..100) {
    auto square_tid = spawn(&square);
    square_tid.send(num);
    auto square = receiveOnly!string();
    writeln(square);
  }
}


void square() {
  static i = 0;
  receive (
       (int num) {
         auto square = num * num;
writeln("sqaure : Comes in with " , num , " for " , ++i , " time");
         auto stringWorker = spawn(&stringConverter);
         stringWorker.send(thisTid, square, ownerTid);
       },
       (Tid tid, string str) {
         writeln("comes in string");
         send(tid, "hello");
       });
}

void stringConverter() {
  static i = 0;
  auto params = receiveOnly!(Tid, int, Tid)();
  auto stringified = to!string(params[1]); // Stringify the square
writeln("string : Comes in with " , params[1], " for " , ++i , " time"); params[0].send(params[2], stringified); // params[0] - square function tid, // params[2] - main function tid
}


I got the answer from stackoverflow @ https://stackoverflow.com/questions/28128383/worker-is-not-finished-while-sending-message-to-intermediate-worker. But the person who answered my question asked me to post back to dlang learn to learn more about it. As I spawn the function and a send a message to stringConverter as it sends a message to the square function why do I need to embed another receive call inside the int case as indicated in the answer. How can I avoid embedding the receive call and why does the person in the second answer used while(1) to receive the message.

Reply via email to