zzzl
(早安的空气)
版主
UID 590
Digest Posts
0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
|
|
在delphi中使用go语言的并发编程方法
google的go语言最近挺热的,除了它很酷的语法外,更吸引开发者的是类似coroutine的goroutine,个人觉得它比lua的coroutine更聪明一些,因为它能在运行时自动组合线程和纤程的能力。另外go语言认为线程间的数据应该通过channel通讯,而不是用地址。这些特点非常方便开发稳定的并发式程序,也提供了清晰的并发编程思路。
go的channel携带一个数据,用于在多个coroutine之间通讯,它容易控制,因为它的规则很简单:没有值时才可以写,否则suspend,有值时才可以读,否则也suspend,并且读写是成对的操作。
其实go的思想也可以拿到delphi里用,可以用线程模仿goroutine,delphi主要用于客户端开发,所以没有go的高效率也可以接受。下面是一个实际效果的演示,希望它可以给多线程中的delphi程序员提供另一个思路。
{$APPTYPE CONSOLE}
uses
SysUtils,
coroutineUnit;
begin
TProc(procedure()
var
c: CChannel<Integer>; //声明一个通道,它可以携带一个整型数据。
i: Integer;
begin
c:=CChannel<Integer>.Create;
for i:=1 to 5 do //创建五个任务线程,并立即开始工作。
go( //在go语言里,有一个go关键字,用于把一个函数以goroutine方式运行,这里使用了go语言的风格,用一个go函数代替。
procedure()
begin
Sleep(1000); //假设这个任务比较复杂,花费了一秒时间。
c.value:=1; //任务完成后,给通道一个值,这个值是多少在这个示例里不重要,它仅仅是给出一个信号:我完成了
end);
for i:=1 to 5 do //对这五个任务判定是否已完成
c.value; //当value有值时,这句才能读到,否则就等待
Writeln('全部完成');
c.Free;
end)();
Readln;
end.
示例代码和coroutineUnit.pas在附件里。
首发cnpack.org
bug反馈:22140505@qq.com
Attachment:
在delphi中使用go语言的并发编程方法.zip (2010-11-30 10:19, 1.21 K)
Download count 111
|
|
|