diff --git "a/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\345\271\266\345\217\221\347\256\200\350\277\260\357\274\210\345\271\266\345\217\221\347\232\204\344\274\230\345\212\277\357\274\211.md" "b/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\345\271\266\345\217\221\347\256\200\350\277\260\357\274\210\345\271\266\345\217\221\347\232\204\344\274\230\345\212\277\357\274\211.md" index e129fb0..f0822fa 100644 --- "a/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\345\271\266\345\217\221\347\256\200\350\277\260\357\274\210\345\271\266\345\217\221\347\232\204\344\274\230\345\212\277\357\274\211.md" +++ "b/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\345\271\266\345\217\221\347\256\200\350\277\260\357\274\210\345\271\266\345\217\221\347\232\204\344\274\230\345\212\277\357\274\211.md" @@ -63,9 +63,11 @@ channel 是类型相关的,也就是说,一个 channel 只能传递一种类 就不难理解 channel,可以将其认为是一种类型安全的管道。 定义一个 channel 时,也需要定义发送到 channel 的值的类型,注意,必须使用 make 创建 channel,代码如下所示: + ci := make(chan int) cs := make(chan string) cf := make(chan interface{}) + 回到在 Windows 和 Linux 出现之前的古老年代,在开发程序时并没有并发的概念,因为命令式程序设计语言是以串行为基础的, 程序会顺序执行每一条指令,整个程序只有一个执行上下文,即一个调用栈,一个堆。 @@ -87,3 +89,5 @@ cf := make(chan interface{}) 并发能更客观地表现问题模型; 并发可以充分利用 CPU 核心的优势,提高程序的执行效率; 并发能充分利用 CPU 与其他硬件设备固有的异步性。 + + diff --git "a/Go\350\257\255\350\250\200\345\271\266\345\217\221/1.go" "b/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213/1.go" similarity index 100% rename from "Go\350\257\255\350\250\200\345\271\266\345\217\221/1.go" rename to "Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213/1.go" diff --git "a/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213/Go\350\257\255\350\250\200goroutine\357\274\210\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213\357\274\211.md" "b/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213/Go\350\257\255\350\250\200goroutine\357\274\210\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213\357\274\211.md" new file mode 100644 index 0000000..646b94a --- /dev/null +++ "b/Go\350\257\255\350\250\200\345\271\266\345\217\221/Go\350\257\255\350\250\200\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213/Go\350\257\255\350\250\200goroutine\357\274\210\350\275\273\351\207\217\347\272\247\347\272\277\347\250\213\357\274\211.md" @@ -0,0 +1,28 @@ +在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系, +以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。 + +虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。 +能否有一种机制:使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作。 +这种机制在 Go语言中被称为 goroutine。 + +goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。 + +Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。 + +### 使用普通函数创建 goroutine + +Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,一个 goroutine 必定对应一个函数。 +1) 格式 +为一个普通函数创建 goroutine 的写法如下: +go 函数名( 参数列表 ) + +函数名:要调用的函数名。 +参数列表:调用函数需要传入的参数。 + +使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。 + +如果需要在 goroutine 中返回数据,请使用后面介绍的通道(channel)特性,通过通道把数据从 goroutine 中作为返回值传出。 +2) 例子 +使用 go 关键字,将 running() 函数并发执行,每隔一秒打印一次计数器,而 main 的 goroutine 则等待用户输入,两个行为可以同时进行。请参考下面代码: + + 案例 + * 1.go \ No newline at end of file