我運行的程式:
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"time"
)
var sleepSeconds string
var timeToSleep time.Duration
func init() {
flag.StringVar(&sleepSeconds, "sleep", "1s", "-sleep \"3s\"")
}
func main() {
startTime := time.Now()
fmt.Println("Start Time: ", startTime)
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt)
// Block until a signal is received.
flag.Parse()
timeToSleep, err := time.ParseDuration(sleepSeconds)
if err != nil {
fmt.Println("unable to parse the duration: ", err)
return
}
fmt.Println("Time to Sleep: ", timeToSleep)
myChan := make(chan string)
go one(myChan)
go two(myChan)
go three(myChan)
var s os.Signal
fmt.Println("Signal is, ", s)
go func() {
s = <-c
fmt.Println("After receiving Signal is, ", s)
}()
i := 0
for {
i
generatedString := fmt.Sprintf("%d", i)
fmt.Println("Generating... ", generatedString)
myChan <- generatedString
// time.Sleep(timeToSleep)
fmt.Println("Length of Channel: ", len(myChan))
if s != nil {
break
}
}
fmt.Println("Total time the program ran for: ", time.Since(startTime))
}
func one(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func one: %s\n", val)
time.Sleep(timeToSleep)
}
}
func two(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func two: %s\n", val)
time.Sleep(timeToSleep)
}
}
func three(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func three: %s\n", val)
time.Sleep(timeToSleep)
}
}
當我使用以下標志(5s)運行此程式時
./ichan -sleep "5s" > data.txt
輸出令人費解,因為我看到程式只運行了,2.31606525s但所有 3 個 goroutine 都應該被阻塞至少 5 秒。data.txt 是此存盤庫的一部分以供參考,代碼也可在同一存盤庫中找到。
我的問題是:在功能time.Sleep() one,two并three都應該被阻止,直到睡眠的持續時間,然后使用來自信道的串,但觀察結果是睡眠不具有對夠程任何影響。
uj5u.com熱心網友回復:
timeToSleep, err := 創建一個名為 timeToSleep 的新區域變數,該變數獨立于同名的包級別變數,因此包級別變數始終為零。
您似乎錯過了本機持續時間標志型別:https : //pkg.go.dev/flag#DurationVar
func init() {
flag.DurationVar(&timeToSleep, "sleep", 1*time.Second, `-sleep "3s"`)
}
uj5u.com熱心網友回復:
同一程式的作業副本
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"time"
)
var sleepSeconds string
var timeToSleep time.Duration
var err error
func init() {
flag.StringVar(&sleepSeconds, "sleep", "1s", "-sleep \"3s\"")
}
func main() {
startTime := time.Now()
fmt.Println("Start Time: ", startTime)
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt)
// Block until a signal is received.
flag.Parse()
timeToSleep, err = time.ParseDuration(sleepSeconds)
if err != nil {
fmt.Println("unable to parse the duration: ", err)
return
}
fmt.Println("Time to Sleep: ", timeToSleep)
myChan := make(chan string)
go one(myChan)
go two(myChan)
go three(myChan)
var s os.Signal
fmt.Println("Signal is, ", s)
go func() {
s = <-c
fmt.Println("After receiving Signal is, ", s)
}()
i := 0
for {
i
generatedString := fmt.Sprintf("%d", i)
fmt.Println("Generating... ", generatedString)
myChan <- generatedString
// time.Sleep(timeToSleep)
fmt.Println("Length of Channel: ", len(myChan))
if s != nil {
break
}
}
fmt.Println("Total time the program ran for: ", time.Since(startTime))
}
func one(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func one: %s\n", val)
time.Sleep(timeToSleep)
}
}
func two(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func two: %s\n", val)
time.Sleep(timeToSleep)
}
}
func three(dataCh chan string) {
for val := range dataCh {
fmt.Printf("Value received in func three: %s\n", val)
time.Sleep(timeToSleep)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334886.html
