這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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.
示範項目代碼和所引用的單元在這個貼子裡
http://bbs.cnpack.org/viewthread.php?tid=9514&extra=page%3D1