博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言:context使用的示例
阅读量:3594 次
发布时间:2019-05-20

本文共 1698 字,大约阅读时间需要 5 分钟。

context主要是用于多个协程之间的统一控制,主要包括统一取消和统一超时。下面是关于context对多个协程进行统一控制的示例:

 假设有这样一个应用场景,一个公司(main)有一名经理(manager)和两名工人(worker),公司下班(main exit)有两种可能:一:工人(worker)的工作时间已经达到合同约定的最大时长;二:经理(manager)提前叫停收工。两种可能满足其中一个即可下班。

示例:

package mainimport (	"context"	"fmt"	"time")//worker工作的最大时长,超过这个时长worker自行收工无需等待manager叫停const MAX_WORKING_DURATION = 5 * time.Second//达到实际工作时长后,manager可以提前叫停const ACTUAL_WORKING_DURATION = 10 * time.Secondfunc main() {	ctxWithCancel, cancel := context.WithTimeout(context.Background(), MAX_WORKING_DURATION)	go worker(ctxWithCancel, "[1]")	go worker(ctxWithCancel, "[2]")	go manager(cancel)	<-ctxWithCancel.Done()	//暂停1秒便于协程的打印输出	time.Sleep(1 * time.Second)	fmt.Println("company closed")}func manager(cancel func()){	time.Sleep(ACTUAL_WORKING_DURATION)	fmt.Println("manager called cancel()")	cancel()}func worker(ctxWithCancel context.Context, name string) {	for {		select {		case <-ctxWithCancel.Done():			fmt.Println(name, "return for ctxWithCancel.Done()")			return		default:			fmt.Println(name, "working")		}		time.Sleep(1 * time.Second)	}}

输出:

[1] working[2] working[2] working[1] working[1] working[2] working[2] working[1] working[1] working[2] working[1] return for ctxWithCancel.Done()[2] return for ctxWithCancel.Done()company closed

可见,这次下班是因为ctxWithCancel的计时器到点引起的。

把实际工作时长改成2秒,最大工作时长不变,再运行一次

//worker工作的最大时长,超过这个时长worker自行收工无需等待manager叫停const MAX_WORKING_DURATION = 5 * time.Second//达到实际工作时长后,manager可以提前叫停const ACTUAL_WORKING_DURATION = 2 * time.Second

输出:

[1] working[2] working[2] working[1] workingmanager called cancel()[1] return for ctxWithCancel.Done()[2] return for ctxWithCancel.Done()company closed

可见,worker只工作了2秒就被manager提前叫停了。

至于为什么要用context而不是用计时器加通道来实现,请见另一篇文章

转载地址:http://xnmwn.baihongyu.com/

你可能感兴趣的文章
HMM ,MHMM,CRF 优缺点与区别
查看>>
stop word理解及超全的停用词表
查看>>
同义词挖掘的一些常用方法 及同义词替换程序
查看>>
文本聚类浅析
查看>>
用户画像全面精析
查看>>
对话系统分析与展望
查看>>
基于VSM的命名实体识别、歧义消解和指代消解
查看>>
算术运算符和比较运算符
查看>>
复制带随机指针的链表
查看>>
【SpringMVC】十、SSM整合入门
查看>>
【Dubbo】一、入门概念
查看>>
学习Java Socket网络编程(三)
查看>>
Java方法参数之参数传递方式
查看>>
mysql安装和配置ODBC驱动,然后tableau链接MySQL数据库
查看>>
以项目为导向,助您入门python之网络爬虫-爬取京东商品plus价格低于原价5折的商品(三)
查看>>
物联网之智能灯开发-前言
查看>>
物联网之智能灯-Django(一)
查看>>
使用计算机视觉技术进行工业品质检测
查看>>
Java重要知识点——方法的定义
查看>>
LinkedHashSet的使用
查看>>