CnPack Forum


 
Subject: 在delphi中使用go语言的并发编程方法
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2010-11-30 10:19  Profile | Blog | P.M.  | QQ
在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
Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2010-11-30 10:44  Profile | Blog | P.M.  | QQ
补充说明一下示例的内容:

就是 启动几个工作线程,直到它们都完成时,程序才继续往下执行
Top
rockswj
新警察
Rank: 1



UID 55819
Digest Posts 0
Credits 2
Posts 1
点点分 2
Reading Access 10
Registered 2010-11-30
Status Offline
Post at 2010-11-30 11:28  Profile | Blog | P.M. 
爱国贼老大你好猛啊
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2010-11-30 12:50  Profile | Site | Blog | P.M. 
zzzl,建议你把正文帖到源阅读的Delphi技巧帖子里

让更多人能看到。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
SuperYoyoNC
新警察
Rank: 1



UID 310
Digest Posts 0
Credits 9
Posts 8
点点分 9
Reading Access 10
Registered 2004-2-2
Location 中国上海
Status Offline
Post at 2017-1-21 11:41  Profile | Site | Blog | P.M.  | QQ
附件全部失效了 :mad:
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6618
Posts 3488
点点分 6618
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2017-10-25 22:49  Profile | Blog | P.M. 
我在硬盘里找到一个古老的附件,因这儿的附件上传不靠谱,传2ccc里你的帖子下面了(应该是你的帖子吧)。
Top
 




All times are GMT++8, the time now is 2021-2-26 15:30

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.011134 second(s), 8 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP