我们写C 的时候,假如用到多进程,我们通常都会用信号,管理等来进程进程间的通信, 那么golang是怎么实现这个的呢?? 直接看码说话吧
package main
import (
"fmt"
"time"
)
func main() {
timeout := make(chan bool, 1)
go func() {
fmt.Println("------------ 子进程1--------------")
t1 := time.Now().UnixNano()
fmt.Println(t1)
fmt.Println("这个一定会执行")
time.Sleep(3 * time.Second)
// timeout <- true
timeout <- true
}()
fmt.Println("首先逻辑还是响应 main 函数")
go func() {
fmt.Println("------------ 子进程2--------------")
t2 := time.Now().UnixNano()
fmt.Println(t2)
fmt.Println("相当于fork一个子进程在进行")
}()
ch := make(chan int)
select {
case <-ch:
case <-timeout:
fmt.Println("------------ 回到main函数 --------------")
fmt.Println("task is timeout!")
}
fmt.Println("main 函数本身的输出")
}
我们执行代码看一看结果
首先逻辑还是响应 main 函数
------------ 子进程2--------------
1471577916141068800
相当于fork一个子进程在进行
------------ 子进程1--------------
1471577916142068800
这个一定会执行
------------ 回到main函数 --------------
task is timeout!
main 函数本身的输出
分别从 纳秒的时间戳可以看出, 两个 go func() 几乎是同时执行的, 这种是golang并行处理的写法, 是直接调用系统的epoll处理流程, golang同样提供了一种监视手段去监视每个并行处理逻辑的返回, select就是这种手段