Go-多路选择和超时控制

目录

一、select  多路选择机制

1、selct 的语法格式

二、超时控制

1、time.After()


一、select  多路选择机制

1、selct 的语法格式

select 的语法和 switch 的语法很类似,它的执行顺序并不一定是按照我们代码的前后关系来决定的,而是满足哪个 case ,就执行这个 case 的结果。如果所有的 channel 都处于阻塞中,则走 default。

select {
//从 channel 上等待一个消息
case ret := <-retCh1:
	t.Logf("result:%s", ret)
//从另一个 channel 上等待一个消息
case ret := <-retCh2:
	t.Logf("result:%s", ret)
//如果所有的 channel 都处于阻塞中,则走 default
default:
	t.Error("No more returned")
}

二、超时控制

利用 select 的多路选择机制,我们可以实现一个超时机制,例如当某个 channel 多久后还没有消息返回,我们就返回超时。

1、time.After()

time.After() 是在一段时间后,往 channel 里面发送一个消息,当没有达到设定的时间,这个 case 会被阻塞在这儿,当超过了我们设定的 duration 后,这个 case 就能从 channel 里面拿到数据,然后就可以用来做超时控制。

select {
case ret := <-retCh1:
	t.Logf("result:%s", ret)
case ret := <-time.After(time.Second * 5):
	t.Error("time out")
}
package _select

import (
	"fmt"
	"testing"
	"time"
)

func service() string {
	time.Sleep(time.Millisecond * 50)
	return "service执行完成"
}

func otherTask() {
	fmt.Println("otherTask的各种执行逻辑代码")
	time.Sleep(time.Millisecond * 100)
	fmt.Println("otherTask执行完成")
}

func syncService() chan string {
	//声明一个 channel, 数据存放只能为 string 类型
	resCh := make(chan string)

	go func() {
		ret := service()
		fmt.Println("service 结果已返回")
		//因为不是用的 buffer channel, 所以,协程会被阻塞在这一步的消息传递过程中,
		//只有接受者拿到了 channel 中的消息,channel 放完消息后面的逻辑才会被执行。
		resCh <- ret
		fmt.Println("channel 放完消息后面的逻辑")
	}()

	return resCh
}

//异步返回执行结果,先调用 SyncService(), 把它放入channel,用协程去执行,
//然后主程序继续执行 otherTask(),最后吧 SyncService() 的返回结果
//从 channel 里面取出来。
func TestSyncService(t *testing.T)  {
	select {
	case ret := <-syncService():
		otherTask()
		t.Logf("result:%s", ret)
	case <-time.After(time.Millisecond * 10) :
		t.Error("time out")
	}
}

/*
执行结果:
=== RUN   TestSyncService
    select_test.go:45: time out
--- FAIL: TestSyncService (0.01s)
FAIL
*/

因为 service() 需要执行 0.05秒,我们设置了 0.01 秒就超时,所以就走了 time out。

:这篇博文是我学习中的总结,如有转载请注明出处:

https://blog.csdn.net/DaiChuanrong/article/details/118312862

上一篇Go-CSP并发机制

下一篇Go-channel的关闭和广播​​​​​​​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 go-mysql 库与数据库进行交互时,可以通过设置连接的超时时间来控制操作的超时行为。下面是一个示例代码,展示了如何配置 go-mysql 的超时时间: ```go import ( "database/sql" "fmt" "time" "github.com/go-sql-driver/mysql" ) func main() { // 创建 MySQL 连接配置 cfg := mysql.Config{ User: "username", Passwd: "password", Net: "tcp", Addr: "localhost:3306", DBName: "database_name", Timeout: 5 * time.Second, // 设置连接超时时间 ReadTimeout: 5 * time.Second, // 设置读取超时时间 WriteTimeout: 5 * time.Second, // 设置写入超时时间 } // 创建 MySQL 数据库连接 db, err := sql.Open("mysql", cfg.FormatDSN()) if err != nil { fmt.Println("Failed to connect to MySQL:", err) return } defer db.Close() // 设置连接的最大闲置时间 db.SetConnMaxIdleTime(10 * time.Second) // 设置连接的最大生存时间 db.SetConnMaxLifetime(30 * time.Second) // 设置连接池中的最大连接数 db.SetMaxOpenConns(100) // 进行数据库操作... } ``` 在上述示例中,我们使用了 `mysql.Config` 结构来设置连接的超时时间,包括 `Timeout`、`ReadTimeout` 和 `WriteTimeout` 参数。此外,我们还设置了连接的最大闲置时间、最大生存时间和连接池中的最大连接数。 根据你的需求,你可以调整这些超时时间和连接池的配置。通过这些设置,你可以控制与数据库的超时行为,并优化连接的管理。希望这个示例能对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值