在 DAY 2~DAY 4 我们使用到了 goroutine、lock、channel,主要目标在保护并发下的资料避免 race condition,接下来会以提高执行效率为讨论重点。
每一个 message 开启一个 goroutine 来运行
如果有多个 task 需要运行,每个 task 的执行时间过长,比如 IO 或者是复杂的运算,那一个一个执行 task 是相当浪费时间的,只要 task 没有执行顺序的需求,可以将所有 task 都同时执行。
并且 Thread-Per-Message Pattern 是用在不需要 goroutine 回传值的情境中,如果需要回传值,可以使用 Future Pattern,接下来的文章会再介绍。
设计一个推播新闻系统,会将新的新闻直接推播出去,我们希望推播系统效率要高。
相关的 code 在Github - go-design-patterns。
实作有问题的系统如下:
package main
import (
"fmt"
"time"
)
func PushNews(news string, startTime time.Time) {
time.Sleep(time.Duration(3 * time.Second)) //模拟推播运行的时间
fmt.Printf("%s cost %s\n", news, time.Since(startTime))
}
func main() {
start := time.Now()
allNews := []string{
"中秋节来了",
"记得",
"不要户外烤肉~",
}
for _, news := range allNews {
PushNews(news, start)
}
fmt.Printf("cost %s", time.Since(start))
}
由於每则新闻都是一则一则推播,所以耗时了约 9 秒
在PushNews()
加上go
就可以启动 goroutine 来推播
package main
import (
"fmt"
"time"
)
func PushNews(news string, startTime time.Time) {
time.Sleep(time.Duration(3 * time.Second)) //模拟推播运行的时间
fmt.Printf("%s cost %s\n", news, time.Since(startTime))
}
func main() {
start := time.Now()
allNews := []string{
"中秋节来了",
"记得",
"不要户外烤肉~",
}
for _, news := range allNews {
go PushNews(news, start)
}
time.Sleep(10 * time.Second) //等待goroutine执行完毕
}
由於是同时推播,所以推播只花了 3 秒
资料库中的一对多如何在 django实现呢 先在app models.py 创建ClassRoom ...
今天开箱第四颗宝石,我们将比较 RDS 与 EC2 方案的不同处,用来切入为何 AWS RDS 成...
Shioaji X Backtesting -双均线策略 好啦!经过这麽多堂课,相信大家对Backt...
昨天提到了生成模型(Generative Model),要去计算事前机率(Prior Probabi...