利用channel在goroutins之间控制同步和传递数据
来源:互联网 发布:suse linux和linux区别 编辑:程序博客网 时间:2024/05/29 15:25
利用channel在goroutins之间控制同步和传递数据
发表回复
在java等代码中,我们查询数据库的操作:
1
2
3
4
5
6
2
3
4
5
6
sql = "select * from ....";
result = db.query(sql)
for(item in result)
{
.....
}
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
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
}
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
2
3
4
sql := "select * from ...";
if database.req <- sql; res<-database.res{
//use res
}
if database.req <- sql; res<-database.res{
//use res
}
这么做的好处:
1、实现了同步获取结果,和直接一个线程里调用方法效果相似。
2、调用和被调用在独立的协程里
3、查询列表是一个先进先出的队列
0 0
- 利用channel在goroutins之间控制同步和传递数据
- 【MVC架构】——如何利用Json在View和Controller之间传递数据
- 利用Intent在不同的activity之间传递数据
- 利用粘贴板技术在应用之间传递数据。
- 【Android基础】利用Intent在Activity之间传递数据
- 利用协议在view controller之间传递数据
- 【Android】利用Bundle在不同Activity之间传递数据
- 利用unsafe代码在C++和C#之间传递图像
- 利用unsafe代码在C++和C#之间传递图像
- 利用 WM_COPYDATA 消息 在 C# 和 传统C++应用之间传递数据时,64位平台的问题
- 在Service之间传递数据
- 在活动之间传递数据
- 在Activity之间传递数据
- 如何实现在窗体和窗体之间进行传递数据
- Android如何在Activity和Service之间传递数据
- Android如何在Activity和Service之间传递数据
- JNI:在java和c之间进行数据传递
- JNI:在java和c之间进行数据传递
- Linux下的top命令
- 移植内核学习笔记2-----修改分区及制作根文件系统
- 【李叫兽】为什么你有10年经验,但成不了专家?
- 进程间通信(Interprocess Communications)
- git命令之git fetch的用法
- 利用channel在goroutins之间控制同步和传递数据
- 【OpenCV学习笔记 008】基于形态学运算的图像变换
- LeetCode练习-难题卷
- 我的ubuntu问题汇总
- 从nsq中学习如何优雅的退出go 网络程序
- [阶段二]Android UI窗口组件
- Deepin logo国内 Linux 发行版 Deepin
- Go原子计数
- spring加载--从xml配置文件到内存