最近在用golang改写一个模型服务接口,之前的开发人员用的echo框架,是常见的http方式,不支持多线程的方式,为了提高并发 ,想用多线程(go routine)。若直接go func()的方式,每次来请求,都开一个线程,会导致线程的数量不受控制。在请求数量未知的情况下,怎么可以控制线程数量,复用线程?这就是线程池的概念。上述链接中的代码很有代表性,总结起来模式就两点:

1. 用for循环开启指定数量的线程,然后让每个线程不停地遍历读取同一个管道,从管道中读取任务信息并进行处理;

2. 每次来请求的时候,把请求信息包装一下,放入管道即可,无需其他操作。

这样,客户端请求一进来就被放进管道,而一放进管道就会被早已等待多时的各个线程处理掉,而线程的数量又是恒定的,在不断地跑,可以重复利用,这样就实现了线程池。

以下代码就是一个带线程池的Golang web服务: