CnPack Forum » 技术板块灌水区 » 在delphi中使用go语言的并发编程方法


2010-11-30 10:19 zzzl
在delphi中使用go语言的并发编程方法

[size=2]    google的go语言最近挺热的,除了它很酷的语法外,更吸引开发者的是类似coroutine的goroutine,个人觉得它比lua的coroutine更聪明一些,因为它能在运行时自动组合线程和纤程的能力。另外go语言认为线程间的数据应该通过channel通讯,而不是用地址。这些特点非常方便开发稳定的并发式程序,也提供了清晰的并发编程思路。[/size]
[size=2][/size]
[size=2]    go的channel携带一个数据,用于在多个coroutine之间通讯,它容易控制,因为它的规则很简单:没有值时才可以写,否则suspend,有值时才可以读,否则也suspend,并且读写是成对的操作。[/size]
[size=2][/size]
[size=2]    其实go的思想也可以拿到delphi里用,可以用线程模仿goroutine,delphi主要用于客户端开发,所以没有go的高效率也可以接受。下面是一个实际效果的演示,希望它可以给多线程中的delphi程序员提供另一个思路。[/size]

[i]{$APPTYPE CONSOLE}[/i]

[color=#000080][b]uses[/b][/color]
  [color=#000000]SysUtils[/color][color=#000000],[/color]
  [color=#000000]coroutineUnit[/color];

[color=#000080][b]begin[/b][/color]
    [color=#000000]TProc[/color]([color=#000080][b]procedure[/b][/color]()
    [color=#000080][b]var[/b][/color]
        [color=#000000]c[/color][color=#000000]:[/color] [color=#000000]CChannel[/color][color=#000000]<[/color][color=#000080][b]Integer[/b][/color][color=#000000]>; [/color][color=darkolivegreen] [/color][color=darkgreen]//声明一个通道,它可以携带一个整型数据。
[/color]        [color=#000000]i[/color][color=#000000]:[/color] [color=#000080][b]Integer[/b][/color];
    [color=#000080][b]begin[/b][/color]
    [color=#000000]c[/color][color=#000000]:=[/color][color=#000000]CChannel[/color][color=#000000]<[/color][color=#000080][b]Integer[/b][/color][color=#000000]>.[/color][color=#000000]Create[/color];

    [color=#000080][b]for[/b][/color] [color=#000000]i[/color][color=#000000]:=[/color][color=#0000ff]1[/color] [color=#000080][b]to[/b][/color] [color=#0000ff]5[/color] [color=#000080][b]do  [/b][/color][color=#006400]//创建五个任务线程,并立即开始工作。[/color]
        [color=#000000]go[/color](  [color=#006400]//在go语言里,有一个go关键字,用于把一个函数以goroutine方式运行,这里使用了go语言的风格,用一个go函数代替。[/color]
            [color=#000080][b]procedure[/b][/color]()
            [color=#000080][b]begin[/b][/color]
            [color=#000000]Sleep[/color]([color=#0000ff]1000[/color]);   [color=#006400]//假设这个任务比较复杂,花费了一秒时间。[/color]
            [color=#000000]c[/color][color=#000000].[/color][color=#000000]value[/color][color=#000000]:=[/color][color=#0000ff]1[/color];     [color=#006400]//任务完成后,给通道一个值,这个值是多少在这个示例里不重要,它仅仅是给出一个信号:我完成了[/color]
            [color=#000080][b]end[/b][/color]);

    [color=#000080][b]for[/b][/color] [color=#000000]i[/color][color=#000000]:=[/color][color=#0000ff]1[/color] [color=#000080][b]to[/b][/color] [color=#0000ff]5[/color] [color=#000080][b]do    [/b][/color][color=#006400]//对这五个任务判定是否已完成[/color]
        [color=#000000]c[/color][color=#000000].[/color][color=#000000]value[/color];             [color=#006400]//当value有值时,这句才能读到,否则就等待[/color]
    [color=#000000]Writeln[/color]([color=#0000ff]'全部完成'[/color]);
    [color=#000000]c[/color][color=#000000].[/color][color=#000000]Free[/color];
    [color=#000080][b]end[/b][/color])();

[color=#000000]Readln[/color];
[color=#000080][b]end[/b][/color][color=#000000].[/color]
[color=#000000][/color]
[color=#000000]示例代码和coroutineUnit.pas在附件里。[/color]
[color=#000000]首发cnpack.org[/color]
[color=#000000]bug反馈:22140505@qq.com[/color]

2010-11-30 10:44 zzzl
补充说明一下示例的内容:

就是 启动几个工作线程,直到它们都完成时,程序才继续往下执行

2010-11-30 11:28 rockswj
爱国贼老大你好猛啊

2010-11-30 12:50 zjy
zzzl,建议你把正文帖到源阅读的Delphi技巧帖子里

让更多人能看到。

2017-1-21 11:41 SuperYoyoNC
附件全部失效了:mad: :mad: :mad: :mad:

2017-10-25 22:49 Passion
我在硬盘里找到一个古老的附件,因这儿的附件上传不靠谱,传2ccc里你的帖子下面了(应该是你的帖子吧)。

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.