2017-08-05 44 views
1

我想讓我的Go程序永遠阻止,但沒有任何工作。如何讓一個Go程序永遠阻止

這裏有一些事情我已經嘗試:

package main 

func main() { 
    select{} 
} 

package main 

func main() { 
    ch := make(chan bool) 
    <-ch 
} 

package main 

import "sync" 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(1) 
    wg.Wait() 
} 

每次我得到了同樣的錯誤:fatal error: all goroutines are asleep - deadlock!

我以爲我很容易做到這一點。我能夠讓程序永遠阻止嗎?如果你產生了另一個夠程(這是做的不是阻止其他的東西)

+0

'for true {print(「。」)}' –

回答

2

例如,main夠程塊永遠,

package main 

import (
    "fmt" 
    "time" 
) 

func forever() { 
    for { 
     fmt.Println(time.Now().UTC()) 
     time.Sleep(time.Second) 
    } 
} 

func main() { 
    go forever() 
    select {} // block forever 
} 

輸出:

2017-08-05 02:50:10.138353286 +0000 UTC 
2017-08-05 02:50:11.138504194 +0000 UTC 
2017-08-05 02:50:12.138618149 +0000 UTC 
2017-08-05 02:50:13.138753477 +0000 UTC 
2017-08-05 02:50:14.13888856 +0000 UTC 
2017-08-05 02:50:15.139027355 +0000 UTC 
... 
... 
... 
4

這些方法將工作立即解決此問題是:

time.Sleep(math.MaxInt64)

這將睡〜300年

1

對於這個問題:「如何獲得Go程序永遠阻止」有已經使用一個for循環或time.Sleep答案。

但我想回答「如何讓一個Go程序永遠阻止與一個通道永遠不會收到價值」。

package main 

func main() { 
    ch := make(chan bool) 

    go func(c chan bool) { 
     for { 
     } 
     c <- true // Because c never receives true, 
    }(ch) 

    <-ch // thus ch waits forever. 
} 

我想上面的示例代碼可以幫助理解Go程序爲什麼以及何時會被某個通道阻塞。

+1

謝謝! 我注意到的一件事是,在你的例子中,它使用了99%的CPU。 但是,如果我在'for'循環中放置'time.Sleep(1 * time.Second)',那麼它不會使用所有的CPU。 –

相關問題