在delphi中使用go語言的並發編程方法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

    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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.