mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 05:11:49 +08:00
pool.Mu.Lock()中lock方法首字母需要大写;切片名称错误;process的参数类型应该上下文统一; (#656)
This commit is contained in:
@@ -15,7 +15,7 @@ type Task struct {
|
|||||||
```go
|
```go
|
||||||
type Pool struct {
|
type Pool struct {
|
||||||
Mu sync.Mutex
|
Mu sync.Mutex
|
||||||
Tasks []Task
|
Tasks []*Task
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
sync.Mutex([参见9.3](09.3.md)是互斥锁:它用来在代码中保护临界区资源:同一时间只有一个go协程(goroutine)可以进入该临界区。如果出现了同一时间多个go协程都进入了该临界区,则会产生竞争:Pool结构就不能保证被正确更新。在传统的模式中(经典的面向对象的语言中应用得比较多,比如C++,JAVA,C#),worker代码可能这样写:
|
sync.Mutex([参见9.3](09.3.md)是互斥锁:它用来在代码中保护临界区资源:同一时间只有一个go协程(goroutine)可以进入该临界区。如果出现了同一时间多个go协程都进入了该临界区,则会产生竞争:Pool结构就不能保证被正确更新。在传统的模式中(经典的面向对象的语言中应用得比较多,比如C++,JAVA,C#),worker代码可能这样写:
|
||||||
@@ -23,10 +23,10 @@ sync.Mutex([参见9.3](09.3.md)是互斥锁:它用来在代码中保护临界
|
|||||||
```go
|
```go
|
||||||
func Worker(pool *Pool) {
|
func Worker(pool *Pool) {
|
||||||
for {
|
for {
|
||||||
pool.Mu.lock()
|
pool.Mu.Lock()
|
||||||
// begin critical section:
|
// begin critical section:
|
||||||
task := pool.Task[0] // take the first task
|
task := pool.Tasks[0] // take the first task
|
||||||
pool.Tasks = pool.Task[1:] // update the pool of tasks
|
pool.Tasks = pool.Tasks[1:] // update the pool of tasks
|
||||||
// end critical section
|
// end critical section
|
||||||
pool.Mu.Unlock()
|
pool.Mu.Unlock()
|
||||||
process(task)
|
process(task)
|
||||||
@@ -34,7 +34,7 @@ func Worker(pool *Pool) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
这些worker有许多都可以并发执行;他们可以在go协程中启动。一个worker先将pool锁定,从pool获取第一项任务,再解锁和处理任务。加锁保证了同一时间只有一个go协程可以进入到pool中:一项任务有且只能被赋予一个worker。如果不加锁,则工作协程可能会在`task:=pool.Task[0]`发生切换,导致`pool.Tasks=pool.Task[1:]`结果异常:一些worker获取不到任务,而一些任务可能被多个worker得到。加锁实现同步的方式在工作协程比较少时可以工作的很好,但是当工作协程数量很大,任务量也很多时,处理效率将会因为频繁的加锁/解锁开销而降低。当工作协程数增加到一个阈值时,程序效率会急剧下降,这就成为了瓶颈。
|
这些worker有许多都可以并发执行;他们可以在go协程中启动。一个worker先将pool锁定,从pool获取第一项任务,再解锁和处理任务。加锁保证了同一时间只有一个go协程可以进入到pool中:一项任务有且只能被赋予一个worker。如果不加锁,则工作协程可能会在`task:=pool.Tasks[0]`发生切换,导致`pool.Tasks=pool.Tasks[1:]`结果异常:一些worker获取不到任务,而一些任务可能被多个worker得到。加锁实现同步的方式在工作协程比较少时可以工作的很好,但是当工作协程数量很大,任务量也很多时,处理效率将会因为频繁的加锁/解锁开销而降低。当工作协程数增加到一个阈值时,程序效率会急剧下降,这就成为了瓶颈。
|
||||||
|
|
||||||
新模式:使用通道
|
新模式:使用通道
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user