0
我想知道如果interruptable_call是不中斷的,並且在上下文完成後返回會發生什麼。調用堆棧已經被破壞。退貨行爲將執行什麼? select
如何在一個案例返回而另一個案件仍在運行的情況下執行。這種情況下的函數調用會被終止嗎?以什麼方式?如果這個函數的調用者已經完成了,golang阻塞函數會發生什麼?
package main
import (
"context"
"fmt"
"time"
)
func interruptable_call() <-chan time.Time {
return time.After(1 * time.Second)
}
func A(ctx context.Context) int {
for {
select {
case <-ctx.Done():
fmt.Println("func done")
return 1
case <-interruptable_call():
fmt.Println("blocking")
}
}
return 0
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
fmt.Println("go A")
go A(ctx)
fmt.Println("go A done")
select {
case <-ctx.Done():
fmt.Println("main done")
break
}
}
將如何選擇執行時一個案例回報,而另一種情況仍在運行。這種情況下的函數調用會被終止嗎?以什麼方式? –
按順序選擇運行案例以使「準備就緒」通道等待消息,但是如果已返回的通道獲取消息,則選擇語句選擇此案例並運行它。我不確定這是如何在內部工作的,但我的猜測是任何已經運行的案例都已經完成,並且由於select語句已經完成,所以沒有運行任何案例。 – Nebril