当前位置: 首页 > news >正文

网站建设企业合作邀请函南阳网站排名优化价格

网站建设企业合作邀请函,南阳网站排名优化价格,建个人网站有什么好处,三亚中国检科院生物安全中心门户网站建设context作用 goroutine的退出机制 多个goroutine都是平行的被调度的,多个goroutine如何协调工作涉及通信、同步、通知和退出 通信:goroutine之间的通信同步chan通道 同步:不带缓冲的chan提供了一个天然的同步等待机制。通过WaitGroup也可以…

context作用

goroutine的退出机制

多个goroutine都是平行的被调度的,多个goroutine如何协调工作涉及通信、同步、通知和退出

  • 通信:goroutine之间的通信同步chan通道

  • 同步:不带缓冲的chan提供了一个天然的同步等待机制。通过WaitGroup也可以为多个goroutine提供同步等待机制

  • 通知:这个通知和上面通信的数据不一样,通知通常不是业务数据,而是管理、控制流数据。要处理这个也好办,在输入端绑定两个chan,一个用于业务流数据,另一个用于异常通知数据,然后通过 select 收敛进行处理。这个方案可以解决简的问题,但不是一个通用的解决方案。

  • 退出:goroutine 之间没有父子关系,如何通知 goroutine 退出?可以通过增加一个个单独的通道,借助通道和 select 的广播机制( close channel to broadcast)实现退出

通知退出机制:

  • 读取已经关闭的通道不会引起阻塞,也不会导致panic,而是立即返回该通道存储类型的零值

  • 关闭select监听的某个通道能使select立即感知这种通知,然后进行相应的处理,即所谓的退出通知机制

contet库的设计目的就是跟踪 goroutine调用树,并在这些goroutine 调用树中递通知和元数据

  • 退出通知机制:通知可以传递给整个 goroutine调用树上的每一个goroutine

  • 传递数据:数据可传递给整个goroutine 调用树上的每一个goroutine

使用

var wg sync.WaitGroup
func main() {background := context.Background()//通过cancel进行控制/*cancelctx, cancelFunc := context.WithCancel(background)wg.Add(2)go jiankong1(cancelctx)time.Sleep(time.Second * 2)println("并不是因为主协程退出,而导致另一个协程退出,而是通过cancel方法通知另一个协程进行退出!")cancelFunc()wg.Wait()println("完成退出")*///通过deadline进行控制,也可以通过返回的cancelFunc手动进行控制/*deadline, _ := context.WithDeadline(background, time.Now().Add(time.Second*2))go deadF(deadline)time.Sleep(time.Second * 4)println("结束")*///通过timeout控制,也可以通过返回的cancelFunc手动进行控制   超时以后报的错和deadline控制方式一样 context deadline exceededtimeout, _ := context.WithTimeout(background, time.Second*2)go deadF(timeout)time.Sleep(time.Second * 4)println("结束")
}func deadF(ctx context.Context) {for true {select {case <-ctx.Done():fmt.Println("只给了两秒的执行时间,时间到了,我得退出了。")//此处打印的错误为 context deadline exceededprintln(ctx.Err().Error())returndefault:time.Sleep(time.Millisecond * 1000)fmt.Println("我正在执行...")}}
}func jiankong1(ctx context.Context) {defer wg.Done()cancel, _ := context.WithCancel(ctx)go jiankong2(cancel)for true {select {case <-ctx.Done():fmt.Println("别人通知我主动退出了。在此处进行收尾工作,释放资源等")//此处报错为:context canceledfmt.Println(ctx.Err().Error())returndefault:time.Sleep(time.Millisecond * 100)fmt.Println("我在持续监控中...")}}
}func jiankong2(ctx context.Context) {defer wg.Done()for true {select {case <-ctx.Done():fmt.Println("上级通知我主动退出了。")fmt.Println(ctx.Err().Error())returndefault:time.Sleep(time.Millisecond * 100)fmt.Println("me在持续监控中...")}}
}

Tips:

异步任务使用context注意点:

使用go func进行异步任务传入context时,要考虑context的过期时间,如果异步任务不考虑过期时间,则最好传入一个无过期时间的context,负责异步任务多或执行时间长context会过期,影响异步任务的执行。

场景:mongo批量插入数据后,将返回的Id集合传入异步任务(在异步任务中通过id查询数据),如果共用了接口设置过期时间的context,可能会导致一部分数据查询不到(context过期导致)

http://www.yayakq.cn/news/39140/

相关文章:

  • 网站上的弹框如何做网页网页设计入门基础
  • html编辑器中文版如何做网站排名优化
  • 阿里巴巴 网站设计便捷的大连网站建设
  • 付费的网站推广该怎么做自己开发一个app需要什么
  • 广东融都建设有限公司 公司网站网站的绝对路径
  • 郑州官方发布最新消息谷歌seo综合查询
  • 网站建设设计费会计分录seo快排软件
  • 南山做网站教程wordpress图文直播插件
  • python建立简易网站乐山建网站
  • 广州建设网站是什么关系杭州知名网站制作公司
  • 网站建设技能描述如何做公司网站制作
  • 门户网站建设和管理情况网页美工实训心得
  • 大庆网站制作公司地址做直播网站软件有哪些软件
  • 网站建设的客户在哪里浦东网站制作
  • 建设公司网站模板wordpress自动播放音乐插件
  • 单位建网站怎么做wordpress升级中文版
  • 常州建设网站代理商网站开发的软件环境有哪些
  • 网站备案和域名解析手机网站适应屏幕
  • 沛县网站制作网上帮人卖东西的平台
  • wordpress网站图片深圳做网站那里好
  • 湖南营销推广网站多少费用网站建设上传
  • 如何做原创漫画网站物联网今天正式开网
  • 请seo的人帮做网站排名slim编辑器Wordpress
  • 北京网站开发公司一网天行河北建设厅注册中心网站首页
  • 设计网站物理结构怎么做个人工作总结ppt模板免费
  • 有哪些做数据分析的网站旅游景区网站源码
  • php asp网站开发wordpresscom下载
  • 动漫网站开发与建设网站建设服务器的搭建方式
  • 上海网站搭建公司网站的基本功能
  • Wordpress 充值 卡密海南企业网站做优化排名