美文网首页
Go的进程阻塞

Go的进程阻塞

作者: 莫Y兮 | 来源:发表于2018-03-21 23:38 被阅读746次

在Go语言中,如果使用goroutine,经常需要阻塞主进程来等待goroutine的结束,我们有以下几种方式来实现


使用channel实现

package main

import (
    "log"
    "time"
)

func main() {
    ch := make(chan int, 1)

    go func() {
        log.Println("wait 3s...")
        time.Sleep(3 * time.Second)
        ch<-1
    }()

    <-ch
}

使用waitGroup实现

waiteGroup顾名思义,是等待一组行为执行结束,利用wg.Add()来添加group,利用wg.Donewg.Add(-1)来移除,wg.Wait()一直阻塞直到group完全释放

package main

import (
    "log"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i:=0;i<5;i++{
        wg.Add(1)
        go func(n int) {
            defer wg.Done()
            time.Sleep(3 * time.Second)
            log.Println(n)
        }(i)
    }

    wg.Wait()
}

NSQ源码中使用示例

此处代码是NSQ中封装的WaitGroupWrapper,通过Wrap方法可以方便的添加需要执行的goroutine,并阻塞主进程

package util

import (
    "sync"
)

type WaitGroupWrapper struct {
    sync.WaitGroup
}

func (w *WaitGroupWrapper) Wrap(cb func()) {
    w.Add(1)
    go func() {
        cb()
        w.Done()
    }()
}

阻塞os信号

如果进程被kill,很多时候我们不能立即退出,需要善后,处理类似内存信息持久化等信息。
那么在Go中如何优雅的退出进程,下面这段代码通过捕捉os信号后,进行退出前的异常处理

    signalChan := make(chan os.Signal, 1)
    // 捕捉 Ctrl+c 和 kill 信号,写入signalChan
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    // 此处执行处理逻辑
    nsqd.Main()

    // signalChan阻塞进程
    <-signalChan

    // 捕捉信号后在Exit函数中处理信息,例如内存持久化等信息防止丢失
    nsqd.Exit()

相关文章

  • Go的进程阻塞

    在Go语言中,如果使用goroutine,经常需要阻塞主进程来等待goroutine的结束,我们有以下几种方式来实...

  • 【高性能网络编程】基础知识2 IO多路复用与Reactor 模式

    对比几种不同的 IO 阻塞IO应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。特点:阻塞进程,C...

  • Linux 里进程阻塞原理

    误区一:进程阻塞消耗 CPU 资源 我以前以为进程阻塞是不好的,比如 NIO 里 Socket socket = ...

  • Go netpoller

    摘要 这边文章将介绍 Go 如何处理网络 I/O 阻塞I/O 在Go中,所有的I/O都是阻塞的。 Go生态系统是围...

  • 深入理解并发/并行,阻塞/非阻塞,同步/异步

    1. 阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: 一个线程/进程经历的5个状态,...

  • 深入理解并发/并行,阻塞/非阻塞,同步/异步

    1. 阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: 一个线程/进程经历的5个状态,...

  • IO多路复用 2021-10-03

    阻塞和非阻塞 进程进入waiting状态,就是阻塞阻塞/非阻塞,关注的是调用方的状态,往往是与系统调用(syste...

  • 并发编程(四):阻塞队列

    一、什么是阻塞队列 1.1 简介 阻塞队列(BlockingQueue)是用于进程间通信或同一进程内的线程间通信的...

  • 进程,线程,阻塞

    进程Process 场景 notepad.exe是一个程序,不是进程 双击notepad.exe时,操作系统会开启...

  • BIO NIO AIO

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 阻塞和非阻塞:是针对于进程在访...

网友评论

      本文标题:Go的进程阻塞

      本文链接:https://www.haomeiwen.com/subject/tkcoqftx.html