- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
上下文:https://tour.golang.org/concurrency/5
大家好,我正在按照上面的链接学习围棋。
描述说“如果多个准备就绪,它会随机选择一个。”然而,在调用 func fibonacci 之前让主例程等待 2 秒。 2 秒后 channel 应如下所示:c:10次调用以从 channel 获取值(value)退出:0
在我看来,两个 channel 都已准备就绪。如果“如果多个准备就绪,它会随机选择一个”为真,那么斐波那契案例中的第一个调用将有 50% 的机会从退出 channel 获得 0。然而,事实并非如此。所有 10 个数字总是会在退出前打印出来。因此看起来选择不是随机的。我错过了什么吗?
package main
import "fmt"
import "time"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
time.Sleep(2 * time.Second)
fibonacci(c, quit)
}
此外,下一页: https://tour.golang.org/concurrency/6
看起来默认代码应该打印出任一勾号。或砰!在 500 毫秒。但是,只有 BOOM!始终打印。如果我将默认时间从 50 更改为 55,则会打印 tick 和 BOOM。为什么是这样? After 是否优先于选择中的 Tick?
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(55 * time.Millisecond)
}
}
}
最佳答案
我认为您对 main 方法中发生的事情有误...为了清楚起见,我将分解我认为正在发生的事情
func main() {
c := make(chan int)
quit := make(chan int) // make a couple channels
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c) // blocked here in goroutine
}
quit <- 0
}() // go func { ... }() - you're both writing this closure and invoking it as a goroutine
time.Sleep(2 * time.Second) // sleep for 2 seconds
fibonacci(c, quit) // call fibonacci passing in the channels
}
所以这里实际发生的是你将这个闭包称为一个 goroutine 然后等待 2 秒,在此期间你的 goroutine 仍然坐在 for 循环的主体中等待接收 c
。 , 你调用 fibonacci
它按照您预期的方式执行,进入 for-select,此时您在循环的每次迭代中不断点击该代码 c <- x
(它接收到,i 递增,你再次接收到下一个值,直到循环由于 i == 10 而结束)。然后你继续下一行并在退出 channel 上发送,选择执行该条件并且你的程序退出。
就语言规范所说的首先执行的内容而言;
“select”语句的执行分几个步骤进行:
1) For all the cases in the statement, the channel operands of receive operations and the channel and right-hand-side expressions of send statements are evaluated exactly once, in source order, upon entering the "select" statement. The result is a set of channels to receive from or send to, and the corresponding values to send. Any side effects in that evaluation will occur irrespective of which (if any) communication operation is selected to proceed. Expressions on the left-hand side of a RecvStmt with a short variable declaration or assignment are not yet evaluated. 2) If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection. Otherwise, if there is a default case, that case is chosen. If there is no default case, the "select" statement blocks until at least one of the communications can proceed. Unless the selected case is the default case, the respective communication operation is executed. 3) If the selected case is a RecvStmt with a short variable declaration or an assignment, the left-hand side expressions are evaluated and the received value (or values) are assigned. 4) The statement list of the selected case is executed.
这只是竞争条件下的伪随机,问题是您没有创建竞争条件。
关于去例程: does select really pick a random case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959143/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!