利用channel在goroutins之間控制同步和傳遞資料

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

在java等代碼中,我們查詢資料庫的操作:

sql = "select * from ....";

result = db.query(sql)

for(item in result)

{

.....

}

但是在go語言中,這麼做就有些土了,我們可以利用channel天生的隊列和線程同步的特性來實現。這也是go和其它語言很明顯的思維區別。


db的封裝:

package main

 

var database *db

 

type db struct {

req chan string

res chan interface{}

}

 

func init() {

database = NewDB()

go database.Run()

}

 

//處理查詢請求,請req channel中的SQL取到,執行查詢後結果放在res channel中

func (d *db) Run() {

var s string

 

for {

s = <-d.req

d.res <- d.query(s)

}

}

 

func (d *db) query(sql string) interface{}{

//...

}

func NewDB() *db {

out := new(db)

out.req = make(chan string)

out.res = make(chan bool)

return out

}

 

調用時,將sql放入請求隊列,並阻塞等待響應結果

sql := "select * from ...";

if database.req <- sql; res<-database.res {

//use res

}

 

這麼做的好處:

1、實現了同步擷取結果,和直接一個線程裡調用方法效果相似。

2、調用和被調用在獨立的協程裡

3、查詢列表是一個先進先出的隊列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.