go 多进程与非缓冲通道

简介: go 多进程与非缓冲通道

go实现了真正的多线程, 既然是真正地多线程,那么什么叫做虚假的多线程

我们知道 python 实现了虚假的线程: 当虚假的线程共享同一个cpu时,大家采用时间分片去执行,但是当 某个线程发出 阻塞信息的时候, 比如 输入函数 ,整个程序就会被挂起 ,导致其他线程也无法被执行


提醒:

chan1 := make(chan int ,[ size])


当没有设定 chan 的 size 的时候,默认 0

什么叫做chan的size 当 size =0称为 非缓冲通道

只有 chan1 <- 和 <- chan1 配对时 才可以继续执行

否则进程阻塞等待


但是在缓冲通道中, 只有 chan1 中 数量为0 时

<- chan1 操作才会被阻塞,但是chan <-不会被阻塞


或者 chan1 数量 = size chan1 <- 会被阻塞,但是 <- chan1 不会被阻塞

来看看go 是否实现了真正的不会被阻塞的线程

func gogetinput(goid int, chan1 chan int) string {
    input1 := ""
    fmt.Scanln(&input1)
    fmt.Println(goid, " 输入是", input1)
    chan1 <- 1
    return input1
}


为什么要创建chan1 因为 go 中 默认不会等待进程的结束

func main() {
    chan1 := make(chan int)
    go gogetinput(1, chan1)
    fmt.Print("没有被阻塞")
    <-chan1
}


输出结果

lmk@pop-os:~/gocode/src/studycolly$ go run usegoprocess.go

没有被阻塞 \nasasas

1 输入是 \nasasas


很明显根据顺序执行的逻辑,应该是先接受 用户的输入 然后进行 打印 没有被阻塞

但是用户输入属于一个阻塞进程,所以无法执行,直到用户输入


但是如果 main 中的 <- chan1 改为 chan1<- 1 ,

gogetinput中的 chan1<-1 改为 <-chan1


则主进程不会等待子进程的结束,我们也就无法看到效果了

Go 很多线程同步 wg

//定义同步变量
var wg sync.WaitGroup
func main(){
for i:=1;i<10;i++{
    wg.Add(1)
    go func(){
            print(i)
            wg.Done()
        }()
    }
//等待所有协程完成
wg.Wait()
}


相关文章
|
供应链 Go
掌握Go语言:利用Go语言的单向通道和select语句,提升库存管理效率(21)
掌握Go语言:利用Go语言的单向通道和select语句,提升库存管理效率(21)
202 0
|
5月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
236 15
|
9月前
|
Go 开发者
Go 并发编程基础:无缓冲与有缓冲通道
本章深入探讨Go语言中通道(Channel)的两种类型:无缓冲通道与有缓冲通道。无缓冲通道要求发送和接收必须同步配对,适用于精确同步和信号通知;有缓冲通道通过内部队列实现异步通信,适合高吞吐量和生产者-消费者模型。文章通过示例对比两者的行为差异,并分析死锁风险及使用原则,帮助开发者根据场景选择合适的通道类型以实现高效并发编程。
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
存储 Go 开发者
Go语言中的并发编程与通道(Channel)的深度探索
本文旨在深入探讨Go语言中并发编程的核心概念和实践,特别是通道(Channel)的使用。通过分析Goroutines和Channels的基本工作原理,我们将了解如何在Go语言中高效地实现并行任务处理。本文不仅介绍了基础语法和用法,还深入讨论了高级特性如缓冲通道、选择性接收以及超时控制等,旨在为读者提供一个全面的并发编程视角。
347 50
|
安全 Java Go
Go语言中的并发编程:掌握goroutine与通道的艺术####
本文深入探讨了Go语言中的核心特性——并发编程,通过实例解析goroutine和通道的高效使用技巧,旨在帮助开发者提升多线程程序的性能与可靠性。 ####
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
存储 安全 Go
Go 并发编程精粹:掌握通道(channels)的艺术
Go 并发编程精粹:掌握通道(channels)的艺术
|
Go 开发者
深入理解Go语言的通道:概念与使用
【8月更文挑战第31天】
247 0
|
存储 Go
Go 语言当中 CHANNEL 缓冲
Go 语言当中 CHANNEL 缓冲