Skip to content

Commit 0026990

Browse files
committed
20220409
1 parent 9868026 commit 0026990

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ ps:白天上班,晚上更新,尽量日更,比心
5151

5252
[第21章 共享内存并发机制](https://github.com/java-aodeng/golang-examples/blob/master/go-21/share_mem_test.go)
5353

54-
第22章 CSP并发机制
54+
[第22章 CSP并发机制](https://github.com/java-aodeng/golang-examples/blob/master/go-22/async_service_test.go)
5555

5656
第23章 多路由选择和超时
5757

go-22/async_service_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package go_22
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
"time"
7+
)
8+
9+
/*
10+
CSP并发机制 当成java的异步操作理解就行了
11+
12+
## Channel
13+
- Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯
14+
- 容量(capacity)代表Channel容纳的最多的元素的数量,代表Channel的缓存的大小。
15+
- 如果没有设置容量,或者容量设置为0, 说明Channel没有缓存,只有sender和receiver都准备好了后它们的通讯
16+
17+
##如图:普通Channel 与 设置容量了Buffered Channels的区别
18+
https://github.com/java-aodeng/golang-examples/blob/master/go-22/channel.png
19+
20+
*/
21+
22+
func service() string {
23+
time.Sleep(time.Millisecond * 50)
24+
return "Done"
25+
}
26+
27+
func otherTask() {
28+
fmt.Println("working on something else")
29+
time.Sleep(time.Millisecond * 100)
30+
fmt.Println("Task is done.")
31+
}
32+
33+
func TestService(t *testing.T) {
34+
fmt.Println(service())
35+
otherTask()
36+
}
37+
38+
//运行结果 可以看到结果是串行的,而且时间也等于两个函数总数相加 0.15s
39+
//=== RUN TestService
40+
//Done
41+
//working on something else
42+
//Task is done.
43+
//--- PASS: TestService (0.15s)
44+
//PASS
45+
46+
func AsyncService() chan string {
47+
//使用make初始化普通Channel,不指定容量默认就是0 就是普通Channel
48+
retCh := make(chan string)
49+
go func() {
50+
ret := service()
51+
fmt.Println("returned result.")
52+
retCh <- ret
53+
fmt.Println("service exited.")
54+
}()
55+
return retCh
56+
}
57+
58+
func AsyncService2() chan string {
59+
//使用make初始化Buffered Channels, 只要设置了容量,就是Buffered Channels
60+
retCh := make(chan string, 1)
61+
go func() {
62+
ret := service()
63+
fmt.Println("returned result.")
64+
retCh <- ret
65+
fmt.Println("service exited.")
66+
}()
67+
return retCh
68+
}
69+
70+
//使用普通Channel
71+
func TestAsynService(t *testing.T) {
72+
retCh := AsyncService()
73+
otherTask()
74+
fmt.Println(<-retCh)
75+
}
76+
77+
//运行结果 可以看到service exited.是最后返回结果的
78+
//=== RUN TestAsynService
79+
//working on something else
80+
//returned result.
81+
//Task is done.
82+
//Done
83+
//service exited.
84+
//--- PASS: TestAsynService (0.10s)
85+
//PASS
86+
87+
//使用指定容量的Buffered Channels
88+
func TestAsynService2(t *testing.T) {
89+
retCh := AsyncService2()
90+
otherTask()
91+
fmt.Println(<-retCh)
92+
}
93+
94+
//运行结果 可以看到在等待的时候同时执行了,service exited.没有阻塞
95+
//=== RUN TestAsynService
96+
//working on something else
97+
//returned result.
98+
//service exited.
99+
//Task is done.
100+
//Done
101+
//--- PASS: TestAsynService (0.10s)
102+
//PASS

go-22/channel.png

455 KB
Loading

0 commit comments

Comments
 (0)