DAY 5:Thread-Per-Message Pattern,预备...发射!

在 DAY 2~DAY 4 我们使用到了 goroutine、lock、channel,主要目标在保护并发下的资料避免 race condition,接下来会以提高执行效率为讨论重点。

什麽是 Thread-Per-Message Pattern?

每一个 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 秒


<<:  [D03] test

>>:  菜鸡的机器学习入门

django新手村3 -----models 一对多

资料库中的一对多如何在 django实现呢 先在app models.py 创建ClassRoom ...

Day 19 资料宝石:RDS是什麽?RDS vs EC2 (+db) 方案比较

今天开箱第四颗宝石,我们将比较 RDS 与 EC2 方案的不同处,用来切入为何 AWS RDS 成...

Day22 - Shioaji X Backtesting -双均线策略

Shioaji X Backtesting -双均线策略 好啦!经过这麽多堂课,相信大家对Backt...

【Day 11】分类(Classification)(下)

昨天提到了生成模型(Generative Model),要去计算事前机率(Prior Probabi...