利用channel在goroutins之间控制同步和传递数据

利用channel在goroutins之间控制同步和传递数据

在java等代码中,我们查询数据库的操作:

1
2
3
4
5
6
sql = "select * from ...." ;
result = db. query (sql )
for (item in result )
{
.....
}

但是在go语言中,这么做就有些土了,我们可以利用channel天生的队列和线程同步的特性来实现。这也是go和其它语言很明显的思维区别。

db的封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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放入请求队列,并阻塞等待响应结果

1
2
3
4
sql := "select * from ..." ;
if database. req <- sql ; res <-database. res {
    //use res
}

这么做的好处:
1、实现了同步获取结果,和直接一个线程里调用方法效果相似。
2、调用和被调用在独立的协程里
3、查询列表是一个先进先出的队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值