Skip to content

Commit

Permalink
go并发
Browse files Browse the repository at this point in the history
  • Loading branch information
webtao520 committed Nov 2, 2020
1 parent d6df498 commit ee3944c
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Go语言并发/Go语言并发简述(并发的优势).md
Original file line number Diff line number Diff line change
Expand Up @@ -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 出现之前的古老年代,在开发程序时并没有并发的概念,因为命令式程序设计语言是以串行为基础的,
程序会顺序执行每一条指令,整个程序只有一个执行上下文,即一个调用栈,一个堆。

Expand All @@ -87,3 +89,5 @@ cf := make(chan interface{})
并发能更客观地表现问题模型;
并发可以充分利用 CPU 核心的优势,提高程序的执行效率;
并发能充分利用 CPU 与其他硬件设备固有的异步性。


File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ee3944c

Please sign in to comment.