likes
comments
collection
share

Go 并发 WorkerPool 模式

作者站长头像
站长
· 阅读数 51

Worker Pools 线程池是一种并发模式。该模式中维护了固定数量的多个工作器,这些工作器等待着管理者分配可并发执行的任务。该模式避免了短时间任务创建和销毁线程的代价。

Go 并发 WorkerPool 模式

golang 中,我们使用 goroutinechannel 来构建这种模式。工作器 worker 由一个 goroutine 定义,该 goroutine 通过 channel 获取数据。

接下来让我们通过一个例子,来进一步理解该模式。假设您需要处理来自 CVS 文件的记录数据,我们需要将该文件中的经纬度保存到数据库中。代码如下。点击此处可以获取代码。

🚚 获取测试数据 cities.csv

Go 并发 WorkerPool 模式

输出:

Go 并发 WorkerPool 模式

正如我们所看到的,保存 CSV 中所有记录需要 55 秒,这是很长的时间,可能会导致很多性能问题。用户如果想要上传 CSV 文件,那体验感一定很差。

如何解决这个问题?那我们就使用线程池的方法试试看。

在如下示例中,我们将解决相同的需求,但通过线程池,耗时方面,我们能够看到巨大的差异。来吧!点击此处可以获取代码。

Go 并发 WorkerPool 模式

Go 并发 WorkerPool 模式

输出:

Go 并发 WorkerPool 模式

你看到很大的不同了吗?现在同样的过程只需要 8 秒。正如您所见,当我们需要处理大量数据时,线程池非常有用。

使用线程池,我们必须定义一个函数,在示例中该函数为 worker,该函数用于定义工作进程,您可以看到它接收一个 Channel 通道来处理数据。 另外,我们必须在数据传递到通道之前启动 goroutines 协程,当 Channel 通道获取到值时,goroutines 工作者开始处理它们。

🎉 现在您知道如何实现线程池了!

转载自:https://juejin.cn/post/7132421198964588575
评论
请登录