10-4 用select进行调度

两个generator,1个worker消耗,如果worker处理慢(worker处理sleep 5s)。则会出现有些n没有打印。

package main

import (
    "fmt"
    "time"
    "math/rand"
)


func generator() chan int {
    out := make(chan int)
    go func() {
        i := 0
        for {
            time.Sleep(
                time.Duration(rand.Intn(1500)) *
                    time.Millisecond)
            out <- i
            i++
        }
    }()
    return out
}
func worker(id int, c chan int) {
    for n := range c {
        time.Sleep(5 * time.Second)
        fmt.Printf("Worker %d received %d\n",
            id, n)
    }
}
// <- chan
// chan <-
func createWorker(id int) chan <- int {
    c := make(chan int)
    go worker(id, c)
    return c
}
func main() {
    //var c1, c2 chan int // c1 and c2 = nil
    var c1, c2 = generator(), generator()
    worker := createWorker(0)

    n := 0
    hasValue := false
    for {
        var activeWorker chan<- int
        if hasValue {
            activeWorker = worker
        }
        select {
        case n = <-c1:
            //fmt.Println("Received from c1:", n)
            hasValue = true
        case n = <-c2:
            //fmt.Println("Received from c2", n)
            hasValue = true
        case activeWorker <- n:
            hasValue = false
        }
    }
}

 

代码:https://github.com/NIGHTFIGHTING/go_learning/blob/master/src/channel/select/select.go

package main

import (
    "fmt"
    "time"
    "math/rand"
)


func generator() chan int {
    out := make(chan int)
    go func() {
        i := 0
        for {
            time.Sleep(
                time.Duration(rand.Intn(1500)) *
                    time.Millisecond)
            out <- i
            i++
        }
    }()
    return out
}
func worker(id int, c chan int) {
    for n := range c {
        // 模拟worker处理慢情况
        //time.Sleep(5 * time.Second)
        time.Sleep(1 * time.Second)
        fmt.Printf("Worker %d received %d\n",
            id, n)
    }
}
// <- chan
// chan <-
func createWorker(id int) chan <- int {
    c := make(chan int)
    go worker(id, c)
    return c
}
func main() {
    //var c1, c2 chan int // c1 and c2 = nil
    var c1, c2 = generator(), generator()
    worker := createWorker(0)

    var values []int
    tm := time.After(10 * time.Second)
    tick := time.Tick(time.Second)
    for {
        var activeWorker chan<- int // activeWorker is nil,下面activeWorker <- activeValue会阻塞
        var activeValue int
        if len(values) > 0 {
            activeWorker = worker
            activeValue = values[0]
        }
        select {
        case n := <-c1:
            // 缓存数据
            values = append(values, n)
        case n := <-c2:
            // 缓存数据
            values = append(values, n)
        case activeWorker <- activeValue:
            // 数据为准备号activeWorker是nil channel,这里会不会执行
            values = values[1:]
        case <- time.After(800 * time.Millisecond):
            // 没有tick情况下表示,800ms内generator没有生成数据
            // 有tick表示,两次select处理时差是否超过800ms
            fmt.Println("timeout")
        case <- tick:
            fmt.Println("queue len = ", len(values))
        case <- tm:
            // 这段程序运行10s退出
            fmt.Println("bye")
            return
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你需要进行复杂的查询操作,可以使用Hibernate提供的查询语言(HQL)或者使用Criteria API来构建查询。这些查询方式可以灵活地进行数据库查询,不仅限于简单的单表查询。 对于查询操作,通常不需要使用特定的注解来进行配置。注解主要用于实体类属性与数据库表列之间的映射关系,而查询操作则是通过编写查询语句或使用Criteria API来实现。 在使用HQL进行查询时,你可以编写类似于SQL的查询语句,但是使用实体类和属性的名字来代替数据库表和列的名字。同时,HQL还支持一些特定的功能,如关联查询、聚合函数等。 示例代码如下: ```java String hql = "FROM MyEntity e WHERE e.status = :status"; List<MyEntity> entities = session.createQuery(hql) .setParameter("status", MyStatus.ACTIVE) .getResultList(); ``` 在上述示例中,我们使用HQL查询语句从名为"MyEntity"的实体类中查询status属性为"ACTIVE"的所有实体对象。 另外,你还可以使用Criteria API来构建类型安全的查询。Criteria API提供了一组面向对象的API方法,用于构建查询条件、排序规则等。 示例代码如下: ```java CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery<MyEntity> query = cb.createQuery(MyEntity.class); Root<MyEntity> root = query.from(MyEntity.class); query.select(root).where(cb.equal(root.get("status"), MyStatus.ACTIVE)); List<MyEntity> entities = session.createQuery(query).getResultList(); ``` 在上述示例中,我们使用Criteria API构建了一个查询条件,查询status属性为"ACTIVE"的所有MyEntity实体对象。 需要注意的是,以上示例中的实体类和属性名字是根据你的实际情况来替换的。同时,你还需要在进行查询之前获取一个有效的Hibernate Session对象来执行查询操作。 综上所述,对于调度查询操作,你可以使用HQL或Criteria API来构建查询语句,而不需要使用特定的注解来进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值