多线程的使用场景
在开发过程中难免会遇到耗时的任务或者复杂的计算,但为了保证主线程(UI线程)不被阻塞,通常会把这些任务或者计算方法使用多线程处理。我本想实现一个动态人脸识别的程序,通过人脸检测的API不断对摄像头的视频流进行检测,并将人脸的所在位置实时的绘制在canvas上,在这同时也需要使用人脸识别的API来判断我是谁?也将识别的结果绘制出来。由于人脸识别的API调用耗时比较久(大概1S左右),但不能影响人脸追踪的速度,因此人脸识别的API和人脸检测 的API不能都是主线程上去实现。
使用多线程worker API后存在的问题
我尝试将人脸识别的API 放到一个worker中去实现,可以解决上述上问题,但worker的局限性比较大,总结的缺点如下:
- worker线程是通过发送消息这种机制和主线程通讯的,主线程传输过来的数据都要进行二次封装,worker线程接收的数据又要进行二次解析,不像android中直接使用Thread 或者使用线程池这么方便。
- 序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过"{}"或者"new Object"创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。不支持复杂的数据类型(例如嵌套对象)
- 如果使用worker来调用人脸识别的API,参数也要通过发消息进行传递,这种方式编写的代码不太规范,逻辑不清晰。
- 序列化传输的数据量大小限制为16MB,较大的图片无法传输。
- Worker创建后需要手动管理生命周期,且最多同时运行的Worker子线程数量为8个。
- Ability类型的Module支持使用Worker,Library类型的Module不支持使用Worker。
以上是我对worker的理解,针对多线程问题有没有更好的方式去替代呢? |