HTML5 Web Woker 线程池

一、为什么要开子线程

笔者这个项目是一个存储系统的中后台管理GUI,一些信息需要通过CronJob定时地去获取,并且业务对数据的即时性要求高,大量的和持久的HTTP请求是不可避免的,针对这点可以尝试优化。笔者一开始想到的就是使用HTML5的新特性web worker,然后将HTTP的请求工作从主线程放到子线程里面去做,已降低主线程中的负荷。一旦子线程中发起的请求成功或错误后,子线程返回给主线程请求的response对象或者直接返回请求得到的数据或错误信息。最终的方案里,选择的是直接返回请求得到的数据,而不是response对象,这个在后面会详细说明为什么这样做。

二、为什么要设计线程池

一个web worker子线程的开销大概在5MB左右,笔者通过测试代码、观察进程内存消耗、结束子线程后的内存释放里大概得到的,其实这个值相当不准确,哈哈。管它准不准确,这个开销实在是不小的,如果无止尽的开启而不进行控制,可能导致运行改应用时,浏览器的内存消耗极高。通过线程池可以按照浏览器所在的硬件资源进行对子线程的规划和调度,已经对僵尸线程的清理以及新新线程的开辟。

五、为什么要直接返回数据而不是请求的response对象

因为数据可以构建一个普通的Object对象,而请求的response对象并非单纯的Object对象。在子线程和主线程之间使用postMessage等方法进行数据传递,数据传递的方式是克隆一个新的对象,而非传递引用,但response对象作为一个非普通Object的特殊对象是不可以被克隆的......。要传递response对象只有通过操作内存来移交控制权,这就需要用到HTML5里对内存操作的一些新特性比如 Transferable object 的 ArrayBuffer 、 ImageBitmap 等等,来直接移交对response对象在内存中的数据的控制权给主线程中的声明变量,相当于直接操作内存来修改response对象的引用,进而避免因对response对象进行克隆而报错和克隆带来的额外开销。但这个还需笔者有时间再研究研究,这里先选择传递一个普通的Object对象来现实功能。

猜你喜欢

转载自www.cnblogs.com/rock-roll/p/10176557.html