上篇文章中,我们已经学习了使用context实现控制多个goroutine的退出。

本文将继续介绍如何使用context实现超时情况下,让多个goroutine退出。

例子

首先,启动3个goroutine,分别为1,2,3。这3个goroutine又分别启动一个goroutine。

一共有6个goroutine,它们之间关系如下:

  • 1

    • 11
  • 2
    • 21
  • 3
    • 31

task1,2,3被限制在指定时间内结束,即50ms。

如果不能按时结束,会触发超时操作,这样,task 1、2、3接收到超时信号,取消自己启动的goroutine(即task11,21,31),然后退出。

最后,所有的goroutine都退出了。

代码如下:

  1. ackage main
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. )
  7. func PrintTask(ctx context.Context, taskName string) {
  8. for {
  9. select {
  10. case <- ctx.Done():
  11. fmt.Println("task:", taskName, "ctx error:", ctx.Err()," then task exit...")
  12. return
  13. default:
  14. time.Sleep(1*time.Second)
  15. fmt.Println("task:", taskName, " doing something...")
  16. }
  17. }
  18. }
  19. func mainTask(ctx context.Context, taskName string) {
  20. ctx1, cancel := context.WithCancel(ctx)
  21. defer cancel()
  22. // create a new task
  23. newTaskName := taskName + "1"
  24. go PrintTask(ctx1, newTaskName)
  25. for {
  26. select {
  27. case <- ctx.Done():
  28. fmt.Println("task:", taskName, "ctx error:", ctx.Err()," then task exit...")
  29. return
  30. default:
  31. time.Sleep(1*time.Second)
  32. fmt.Println("task:", taskName, " doing something...")
  33. }
  34. }
  35. }
  36. func main() {
  37. ctx := context.Background()
  38. timeout := 50*time.Millisecond
  39. ctx, _ = context.WithTimeout(ctx, timeout)
  40. go mainTask(ctx, "1")
  41. go mainTask(ctx, "2")
  42. go mainTask(ctx, "3")
  43. select{
  44. case <-ctx.Done():
  45. // timeout
  46. fmt.Println("main task error:", ctx.Err())
  47. }
  48. fmt.Println("main exit...")
  49. time.Sleep(3*time.Second)
  50. }

输出

  1. main task error: context deadline exceeded
  2. main exit...
  3. task: 21 doing something...
  4. task: 1 doing something...
  5. task: 21 ctx error: context deadline exceeded then task exit...
  6. task: 3 doing something...
  7. task: 3 ctx error: context deadline exceeded then task exit...
  8. task: 1 ctx error: context deadline exceeded then task exit...
  9. task: 11 doing something...
  10. task: 11 ctx error: context deadline exceeded then task exit...
  11. task: 31 doing something...
  12. task: 2 doing something...
  13. task: 31 ctx error: context deadline exceeded then task exit...
  14. task: 2 ctx error: context deadline exceeded then task exit...

golang context学习记录2的更多相关文章

  1. golang context学习记录1

    1.前言 一个请求,可能涉及多个API调用,多个goroutine,如何在多个API 之间,以及多个goroutine之间协作和传递信息,就是一个问题. 比如一个网络请求Request,需要开启一些g ...

  2. golang "%p"学习记录随笔

    对于获取slice的指针地址, 通过unsafe.Pointer 和 "%p"占位符两种方式得到的地址是不同的 s := make([]int, 1) t.Log(unsafe.P ...

  3. 【golang学习记录】环境搭建

    [golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...

  4. Golang Context 的原理与实战

    本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...

  5. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  6. Spring学习记录(九)---通过工厂方法配置bean

    1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...

  7. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  8. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  9. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

随机推荐

  1. 谷歌浏览器(Chrome)离线包的下载方法!

    谷歌浏览器(Chrome)其实可以下载离线包,用离线包安装的好处,就是一次获得全部安装文件,不需要漫长的在线下载过程了! 下载地址:https://www.google.com/chrome/eula ...

  2. angular实现三级联动

    (function(angular) { 'use strict'; var module = angular.module('timecube.shopManage.group.ctrls', [' ...

  3. WebAPI跨域问题处理

    1.按照https://dzone.com/articles/access-control-allow-origin-header-and-the-aspnet文章所述,在程序中配置允许跨域请求. 但 ...

  4. springboot(2)-阶段篇

    web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters.property.log等 json 接口开发 在以前的spring 开发的时候需要我们提供jso ...

  5. java_day01

    ch01: ===================================== java J2SE 桌面应用的开发 JAVA SE corejava J2EE 企业级开发 JAVA EE J2 ...

  6. deep_learning_Function_tf.control_dependencies([])

    tf.control_dependencies([])函数含义及使用 2019.02.23 14:01:14字数 60阅读 420 tf.control_dependencies([controls_ ...

  7. 递归型SPFA判负环 + 最优比例环 || [Usaco2007 Dec]奶牛的旅行 || BZOJ 1690 || Luogu P2868

    题外话:最近差不多要退役,复赛打完就退役回去认真读文化课. 题面:P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解:最优比例环 题目实际是要求一个ans,使得对于图中 ...

  8. JDK8之Stream新特性

    https://www.cnblogs.com/cbxBlog/p/9123106.html /** *JDK8 Stream特性 * Created by chengbx on 2018/5/27. ...

  9. php和http协议

    http协议:电脑与电脑,网络与网络之间传输需要的一些条件: 比如网线互联,能相互找到ip地址(tcp/ip: b/s结构一定要遵循http协议): 报文都要有报头,要给谁传数据,要传什么数据,传什么 ...

  10. Acwing-96-奇怪的汉诺塔(递推)

    链接: https://www.acwing.com/problem/content/description/98/ 题意: 汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆 ...