Go 为什么下面的代码示例在经过一些迭代后仍然存在?
我正在努力学习golang,我得到了一段代码,我不明白为什么过了一段时间后它会卡住Go 为什么下面的代码示例在经过一些迭代后仍然存在?,go,Go,我正在努力学习golang,我得到了一段代码,我不明白为什么过了一段时间后它会卡住 package main import "log" func main() { deliveryChann := make(chan bool, 10000) go func() { for { deliveryChann <- true log.Println("Sent") } }()
package main
import "log"
func main() {
deliveryChann := make(chan bool, 10000)
go func() {
for {
deliveryChann <- true
log.Println("Sent")
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
for {
}
}
主程序包
导入“日志”
func main(){
交货通道:=制造(chan bool,10000)
go func(){
为了{
deliveryChann主goroutine(为{}
循环运行)占用了线程,因此其他goroutine都无法执行。如果将main
函数的结尾更改为:
for {
runtime.Gosched()
}
然后线程将被释放,另一个goroutine将被激活
func Gosched()
Gosched生成处理器,允许其他goroutine运行。它不会挂起当前goroutine,因此执行会自动恢复
--主goroutine(为{}
循环运行)正在占用线程,因此其他goroutine都无法执行。如果将main
函数的结尾更改为:
for {
runtime.Gosched()
}
然后线程将被释放,另一个goroutine将被激活
func Gosched()
Gosched生成处理器,允许其他goroutine运行。它不会挂起当前goroutine,因此执行会自动恢复
--gorouting的执行顺序未定义。代码卡住是合法的。您可以更确定地与main()
进行通信。例如
for {
deliveryChann <- true
log.Println("Sent")
}
用于{
deliveryChannGoRouting的执行顺序未定义。代码卡住是合法的。您可以更确定地与main()
进行通信。例如,place
for {
deliveryChann <- true
log.Println("Sent")
}
用于{
deliveryChann和这里的问题-如果GOMAXRPOCS
大于1,{}
将只锁定一个线程,其他goroutine可以在其他线程上进行调度。但由于某些原因,不能happen@creker-是的,我也想知道。我目前正在调查原因,因为我不确定原因。更令人费解的是,它在死锁之前运行了一段时间。我会理解它是否会死锁这将非常好。它非常适合在运行时有机会产生更多工作线程之前,{}
锁定进程的情况。仅供参考:我正在运行最新的golang版本,所以gomaxprocs不应该是1。我只了解1个cpu的问题(至少现在我了解),但对于多个CPU,我仍然不知所措。我们感兴趣的行为由调度程序定义。调度程序仅在当前goroutine(i)完成时切换线程的上下文,(ii)进行阻塞系统调用,(ii)进行阻塞运行时调用;或(iv)调用另一个函数(somethines)(参考:).我还是有点陌生,但我想知道:可能独立线程中的上下文切换依赖于调用调度程序的运行线程。我们的主goroutine永远不会调用它。这里的问题是-如果GOMAXRPOCS
大于1,就不会发生这种情况。for{}
将只锁定一个线程,其他goroutine可以在其他线程上进行调度。但由于某些原因,不能happen@creker-是的,我也想知道。我目前正在调查原因,因为我不确定原因。更令人费解的是,它在死锁之前运行了一段时间。我会理解它是否会死锁这将非常好。它非常适合在运行时有机会产生更多工作线程之前,{}
锁定进程的情况。仅供参考:我正在运行最新的golang版本,所以gomaxprocs不应该是1。我只了解1个cpu的问题(至少现在我了解),但对于多个CPU,我仍然不知所措。我们感兴趣的行为由调度程序定义。调度程序仅在当前goroutine(i)完成时切换线程的上下文,(ii)进行阻塞系统调用,(ii)进行阻塞运行时调用;或(iv)调用另一个函数(somethines)(参考:)。我对Go还是有点陌生,但我想知道:可能独立线程中的上下文切换依赖于调用调度程序的运行线程。我们的主goroutine永远不会调用它。为什么操作顺序很重要?通道在任何其他例程运行之前就打开了。运行最新版本的Go,所以没有必要sue了解CPU的数量。(很想了解这是如何发生的)。也许有一个例子可以解释我的意思。这是预期的行为。为什么操作顺序很重要?通道在任何其他例程运行之前打开。运行最新版本的go,所以CPU的数量没有问题。(我很想知道这是怎么发生的)。也许一个击球手的例子可以解释我的意思。这是预期的行为。