编程学习笔记之D语言(一)

  首先,温习一下Erlang的进程,消息传递.

产生一个进程很简单: 
  Pid = spawn(fun)

发送消息: Pid!{Self(), Msg}

消息传递:
receive
  {From, Msg} -> From!Msg
end.

下面的是D语言:

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

struct Exit 
{
}

void workFunc()
{
  bool isDone = false;
  while (!isDone) 
  {
    receive(
	  (Exit message) {
	    writeln("exiting.");
		isDone = true;
	  },
	  (string name, int number) { /* 这里是D语言的Tuple类型:Tuple!(string, int)*/
	    writefln("Buy %s, number %d", name, number);
	  }
	);
  }
}

void main() 
{
  /* 创建线程也是用 spawn ,返回值是Tid 类型*/
  Tid work = spawn(&workFunc);
  
  /* 发送消息使用send方法*/
  work.send("bao zi", 10);
  work.send(Exit());
}

出:
Bye baozi, number 10
exiting

再来实现一下简单的MapReduce模型, 10个10亿的累加和:

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

void calcSum(int start, int end)
{
  long sum = 0;
  foreach(int val; start..end + 1) {
    sum += val;
  }
  ownerTid.send(sum); /*主线程通过ownerTid获取*/
}

void main() 
{
  long sum = 0;
  auto t1 = Clock.currTime();
  foreach(int i; 1..11) {     
    spawn(&calcSum, 1, 100000000);
    sum += receiveOnly!long(); /*接收返回的消息*/
  };
  thread_joinAll(); //等待所有子线程结束
  writeln("sum is ", sum);  
  auto t = Clock.currTime() - t1;  //计算耗时
  writeln(t);
}
我喜欢比较一下执行速度,发现整个过程耗时 4秒多,不用线程的才3秒多..上次scala测试一下也是3秒多。

    spawn(&calcSum, 1, 100000000);
    sum += receiveOnly!long(); /*接收返回的消息*/
感觉是这里有点问题,貌似receiveOnly会让主线程进入等待???


你可能感兴趣的:(编程学习笔记之D语言(一))