Go语言里的标准库里没有线程池的概念,不过我们可以利用Go强大的并发特性自己构建,而且在其它语言里也有成熟的设计模型可供借鉴,这里我们参考Java的线程池模型实现部分功能。
另外,确切地说,这里的线程并非真正意义上的线程,用“协程”这个概念称呼更为合适。
Future的定义
首先我需要实现一个Future的接口, 它是一个任务执行的载体。
|
|
以后,每个要执行的任务都要实现这个接口的方法。
下面我们来通过具体的代码实现这些方法。
Future的具体实现
我们通过两个具体的结构体实现接口。
第一个结构体的作用,是在它初始化的时候给它传进一个整型数组和一个权重值,在它执行时,把这个整型数组的每个元素都乘以这个权重值再输出。
|
|
第二个结构体的作用,是在初始化时传入一个字符串,在它执行时,把字符串里的字母全部转化成小写字母再输出。
|
|
Executor的实现
Executor的结构很简单,我们力求精简,里面只有一个成员 tasks, 它是一个通道类型,它存储了以后我们要执行的任务。
|
|
NewExecutor 函数返回一个初始化后的Executor,这里固定成可以存储10个Future。
通过Executor 的Submit 方法可以提交一个任务,当任务提交完后,调用Executor 的Start 方法后,Executor 会不断轮循任务队列,依次执行所有 的任务。
|
|
在 Executor 的Start 方法中,会通过它另外一个方法exec 再调用每个Future的Run 方法。
|
|
当Future 的Run 方法 执行失败后,有错误返回,会继续调用Future的Failed方法;如果没有错误返回,则调用Future的Success 方法。
启动Executor 执行任务
在main 函数里执行代码。
|
|