Go语言如何并发超时处理详解

实现原理:

并发一个函数,等待1s后向timeout写入数据,在select中如果1s之内有数据向其他channel写入则会顺利执行,如果没有,这是timeout写入了数据,则我们知道超时了。

实现代码:

package main
import "fmt"
import "time"
func main() {
 ch := make(chan int, 1)
 timeout := make(chan bool, 1)
 // 并发执行一个函数,等待1s后向timeout写入true
 go func() {
 time.Sleep(1000)
 timeout <- true
 }()
 // 这里会等待ch或timeout读出数据
 // 因为一直没有向ch写入数据
 // 在1s后向timeout写入了数据
 // 所以执行了timeout的case
 // 利用这个技巧可以实现超时操作
 select {
 case <- ch :
 fmt.Println("read from ch")
 case <- timeout :
 fmt.Println("time out...")
 }
}

总结

以上就是这篇文章的全部内容,希望对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Go语言并发技术详解

    有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行. goroutine goroutine是Go并行设计的核心.goroutine说到底其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享.执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩.也正因为如此,可同时运行成千上万个并发任务.goro

  • Golang极简入门教程(三):并发支持

    Golang 运行时(runtime)管理了一种轻量级线程,被叫做 goroutine.创建数十万级的 goroutine 是没有问题的.范例: 复制代码 代码如下: package main   import (     "fmt"     "time" )   func say(s string) {     for i := 0; i < 5; i++ {         time.Sleep(100 * time.Millisecond)       

  • 如何利用Golang写出高并发代码详解

    前言 之前一直对Golang如何处理高并发http请求的一头雾水,这几天也查了很多相关博客,似懂非懂,不知道具体代码怎么写 下午偶然在开发者头条APP上看到一篇国外技术人员的一篇文章用Golang处理每分钟百万级请求,看完文章中的代码,自己写了一遍代码,下面自己写下自己的体会 核心要点 将请求放入队列,通过一定数量(例如CPU核心数)goroutine组成一个worker池(pool),workder池中的worker读取队列执行任务 实例代码 以下代码笔者根据自己的理解进行了简化,主要是表达出

  • Go语言如何并发超时处理详解

    实现原理: 并发一个函数,等待1s后向timeout写入数据,在select中如果1s之内有数据向其他channel写入则会顺利执行,如果没有,这是timeout写入了数据,则我们知道超时了. 实现代码: package main import "fmt" import "time" func main() { ch := make(chan int, 1) timeout := make(chan bool, 1) // 并发执行一个函数,等待1s后向timeou

  • Go语言开发保证并发安全实例详解

    目录 什么是并发安全? Mutex 悲观锁 乐观锁 版本号机制 CAS 互斥锁 读写互斥锁 什么是并发安全? 在高并发场景下,进程.线程(协程)可能会发生资源竞争,导致数据脏读.脏写.死锁等问题,为了避免此类问题的发生,就有了并发安全. 这里举一个简单的例子: var data int go func() { data++ }() if data == 0 { fmt.Printf("the value is %v.\n", data) } 在这段代码中 第2行go关键字开启了一个新的

  • Go语言通过WaitGroup实现控制并发的示例详解

    目录 与Channel区别 基本使用示例 完整代码 特别提示 多任务示例 完整代码 与Channel区别 Channel能够很好的帮助我们控制并发,但是在开发习惯上与显示的表达不太相同,所以在Go语言中可以利用sync包中的WaitGroup实现并发控制,更加直观. 基本使用示例 我们将之前的示例加以改造,引入sync.WaitGroup来实现并发控制. 首先我们在主函数中定义WaitGroup var wg sync.WaitGroup 每执行一个任务,则调用Add()方法 wg.Add(1)

  • Go语言实现的可读性更高的并发神库详解

    目录 前言 WaitGroup的封装 worker池 Stream ForEach和map ForEach map 总结 前言 前几天逛github发现了一个有趣的并发库-conc,其目标是: 更难出现goroutine泄漏 处理panic更友好 并发代码可读性高 从简介上看主要封装功能如下: 对waitGroup进行封装,避免了产生大量重复代码,并且也封装recover,安全性更高 提供panics.Catcher封装recover逻辑,统一捕获panic,打印调用栈一些信息 提供一个并发执行

  • Java并发编程之详解CyclicBarrier线程同步

    CyclicBarrier线程同步 java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障碍,所有先到达这个障碍的线程都将将处于等待状态,直到所有线程都到达这个障碍处,所有线程才能继续执行. 举个例子:CyclicBarrier的同步方式有点像朋友们约好了去旅游,在景点入口处集合,这个景点入口就是一个Barrier障碍,等待大家都到了才一起进入景点游览参观. 进入景点后大家去爬山,有的人爬得快,有的人爬的慢,大家约好了山顶集合

  • Go语言学习之WaitGroup用法详解

    目录 前言 小试牛刀 总览 底层实现 结构体 Add Done Wait 易错点 总结 前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言中的 WaitGroup 和 Java 中的 CyclicBarrier.CountDownLatch 非常类似.比如我们有一个主任务在执行,执行到某一点时需要并行执行三个子任务,并且需要等到三个子任务都执行完后,再继续执行主任务.那我们就需要设置一个检查点,使主任务一直阻塞在这,等三个子任务执行完后再放行. 说明:本文中的示例,均是

  • java ReentrantLock并发锁使用详解

    目录 一.ReentrantLock是什么 1-1.ReentrantLock和synchronized区别 1-2.ReentrantLock的使用 1-2-1.ReentrantLock同步执行,类似synchronized 1-2-2.可重入锁 1-2-3.锁中断 1-2-4.获得锁超时失败 1-2-5.公平锁 一.ReentrantLock是什么 ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种

  • GoLang切片并发安全解决方案详解

    目录 1.介绍切片并发问题 2.实践检验真理 3.回答切片并发安全问题 4.解决切片并发安全问题方式 5.附 1.介绍切片并发问题 关于切片的,Go语言中的切片原生支持并发吗? 2.实践检验真理 实践是检验真理的唯一标准,所以当我们遇到一个不确定的问题,直接写demo来验证,因为切片的特点,我们可以分多种情况来验证 1.不指定索引,动态扩容并发向切片添加数据 2.指定索引,指定容量并发向切片添加数据 不指定索引,动态扩容并发向切片添加数据 不指定索引,动态扩容并发向切片添加数据: 通过打印数据发

  • Go语言Goroutinue和管道效率详解

    目录 goroutinue基本介绍 进程和线程说明 并发和并行 同步和异步 Go协程和Go主线程 go协程特点 goroutinue基本使用 实验代码 效果图 执行流程图 goroutinue的调度模型 MPG MPG运行状态1 MPG运行状态2 管道(channel) 不同协程之间如何通讯 全局变量加锁同步缺陷 管道基本介绍 管道基本使用 声明和定义 管道关闭和遍历 关闭 遍历 管道注意事项 综合案例 goroutinue基本介绍 进程和线程说明 进程介绍程序在操作系统中的一次执行过程,是系统

  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[10]; 指针数组简言之就是存放指针的数组: --数组并非指针&&指针并非数组 (1)定义一个外部变量: eg:int value=10; int *p=&value; 举例:当需要在一个函数中用这个变量时:externa int*p;而非extern int p[]; 分析:当用:e

随机推荐