任务分发的实现方式
常见的使用背景:当我们使用并发的时候,往往是需要利用多核优势,将一个任务分解成一堆可以并行的子任务,执行所有子任务,然后将所有数据汇总起来.
1. 使用多线程的实现方式
- 开启多个子线程
- 主线程会等待子线程放回.
- 将结果返回,并整合结果; 可能需要考虑全局变量并发写问题(加个写锁);
2. 那用go协程怎么实现(Go语言实现方式)
- go一个函数,开启一个协程
- 主线程会等待channel状态变为可读. 协程向channel写数据;
- 主线程获取到数据,整合结果.
- 通过协程,我们只需要主线程从channel拿数据,主线程负责数据写入;
- 如果是子线程负责各自数据的写入,那一般的实现为多个线程共享某个全局变量,然后每个线程都会往全局变量中写入数据,需要考虑加个写锁.
3. 那使用异步怎么实现呢? (JavaScript实现方式)
- 创建一堆Promise,将其放入数组中
- 执行Promise.all,如果是async函数,可以await Promise.all
- awaitt等待直到获取Promise.all函数的返回值; 或者在Promise.all的then函数中处理.