Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0026990

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /