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


    在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、查询列表是一个先进先出的队列

  • 相关阅读:
    vue
    mongodb
    ejs模板引擎
    ajax
    node.js2
    node.js1
    bootstrap,ECMA
    商城
    面试:----Struts和springmvc的区别--区别上
    OpenStack
  • 原文地址:https://www.cnblogs.com/baiyuxiong/p/4440580.html
Copyright © 2020-2023  润新知