利用channel在goroutins之间控制同步和传递数据
2015-04-20 07:44
399 查看
在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、查询列表是一个先进先出的队列
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、查询列表是一个先进先出的队列
相关文章推荐
- 利用channel在goroutins之间控制同步和传递数据
- cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据
- 线程之间传递数据对象(利用线程槽实现)
- 多视的情况下如何在视之间传递数据?MFC的做法是利用文档来处理
- 利用Intent在不同的activity之间传递数据
- 利用Bundle实现Activity之间的数据传递。
- .net利用SQLBulkCopy进行数据库之间的大批量数据传递
- 【MVC架构】——如何利用Json在View和Controller之间传递数据
- 如何利用rsync同步两台服务器 (redhat 7.0版本) 之间的数据?
- [转载]pda 和pc 之间的文件操作(利用Microsoft ActiveSync同步文件数据)
- [转载]pda 和pc 之间的文件操作(利用Microsoft ActiveSync同步文件数据)
- struts2的视图层和控制层之间的通信(数据传递)方式。
- 利用DBLink+JOB实现两个Oracle数据库之间的数据同步
- BroadcastReceiver广播接收者(三)——利用广播在应用程序之间传递数据
- 【MVC架构】——怎样利用Json在View和Controller之间传递数据
- BroadcastReceiver广播接收者(三)——利用广播在应用程序之间传递数据
- Activity之间利用Intent进行数据的传递
- 利用viewstack组件实现各个子组件之间的跳转和数据传递
- android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler&利用broadcast广播机制
- ndk开发中利用java与c之间互相传递数据