funcserver(op binOp, service chan *Request) { for { req := <-service; // requests arrive here // start goroutine for request: go run(op, req); // don’t wait for op to complete } }
funcmain() { adder := startServer(func(a, b int)int { return a + b }) const N = 100 var reqs [N]Request for i := 0; i < N; i++ { req := &reqs[i] req.a = i req.b = i + N req.replyc = make(chanint) adder <- req // adder is a channel of requests } // checks: for i := N - 1; i >= 0; i-- { // doesn’t matter what order if <-reqs[i].replyc != N+2*i { fmt.Println(“fail at”, i) } else { fmt.Println(“Request “, i, “is ok!”) } } fmt.Println(“done”) }
这些代码可以在 multiplex_server.go 找到
输出:
Request 99 is ok!
Request 98 is ok!
...
Request 1 is ok!
Request 0 is ok!
done
这个程序仅启动了 100 个协程。然而即使执行 100,000 个协程我们也能在数秒内看到它完成。这说明了 Go 的协程是如何的轻量:如果我们启动相同数量的真实的线程,程序早就崩溃了。
funcserver(op binOp, service chan *Request) { for { req := <-service // requests arrive here // start goroutine for request: go run(op, req) // don't wait for op } }
funcmain() { adder := startServer(func(a, b int)int { return a + b }) const N = 100 var reqs [N]Request for i := 0; i < N; i++ { req := &reqs[i] req.a = i req.b = i + N req.replyc = make(chanint) adder <- req } // checks: for i := N - 1; i >= 0; i-- { // doesn't matter what order if <-reqs[i].replyc != N+2*i { fmt.Println("fail at", i) } else { fmt.Println("Request ", i, " is ok!") } } fmt.Println("done") }
funcmain() { adder, quit := startServer(func(a, b int)int { return a + b }) const N = 100 var reqs [N]Request for i := 0; i < N; i++ { req := &reqs[i] req.a = i req.b = i + N req.replyc = make(chanint) adder <- req } // checks: for i := N - 1; i >= 0; i-- { // doesn't matter what order if <-reqs[i].replyc != N+2*i { fmt.Println("fail at", i) } else { fmt.Println("Request ", i, " is ok!") } } quit <- true fmt.Println("done") }