这两天研究一下html5的多线程,根据网上的例子做了一下测试,觉得web worker确实很强大,但一直有一个概念一直不理解,做了个小例子测试一下专用线程和共享线程的区别。
一、专用线程与共享线程概念理解
与网上其他文章类似的文章参考其他相关资料,个人理解,专用线程只适用于当前客户端使用,与其他客户端无关联,适用于本客户端内的多线程使用。共享线程适用于多个客户端之间进行数据的交互和控制,但本身html5中没有类似锁机制,所以无安全可言,全靠个人修为。
二、专用线程测试
测试代码:
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>Background Worker Application Example 1: Complicated Number Computation</title> </head> <body> <form> <div> 计算fibonacci, 请输入计算的数值:<input type="number" id="num" value="10" required="required" /><input type="button" value="计算" onclick="calc()" /> <br><br><div style="float:left;">结果:</div><div id="results" style="border-bottom:1px solid #ccc; width:200px;height:20px;float:left;font-size:9px;"></div> </div> </form> <script> var worker; onload = function() { worker = new Worker('js/numberworker.js'); worker.addEventListener('message', function(event) { document.getElementById("results").innerHTML = event.data; }, false); worker.onerror = function(error) { alert(error.message); }; }; var calc = function(){ worker.postMessage(parseInt(document.getElementById("num").value)); document.getElementById("results").innerHTML = "please wait, computing ... ..."; }; </script> </body> </html>
numberworker.js 代码:
//关注connect_number在不同的浏览器实例中的值,各自为政,互不干涉 var connect_number = 0; var fibonacci = function(n) { return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2); }; onmessage = function(event) { connect_number++; var n = parseInt(event.data, 10); var result = "connection "+connect_number+ " is " + fibonacci(n); postMessage(result); };
三、共享线程测试
参考代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Shared worker example: how to use shared worker in HTML5</title> </head> <body onload=''> <output id="response_from_worker"> Shared worker example: how to use shared worker in HTML5 </output> <br>send instructions to shared worker: <input type="text" id="inputText" autofocus oninput="postMessageToSharedWorker(this);return false;" /> <script> var worker = new SharedWorker('js/sharedworker.js'); var log = document.getElementById('response_from_worker'); worker.port.addEventListener('message', function(e) { //log the response data in web page log.textContent = e.data; }, false); worker.port.start(); worker.port.postMessage('ping from user web page..'); //following method will send user input to sharedworker function postMessageToSharedWorker(input) { //define a json object to construct the request var instructions = { instruction : input.value }; worker.port.postMessage(instructions); } </script> </body> </html>
相关的sharedworker.js代码如下:
/* * define a connect count to trace connecting * this variable will be shared within all connections */ var connect_number = 0; onconnect = function(e) { //关注connect_number 的值的变化,在不同的浏览器实例中,它的值是共享的 connect_number = connect_number + 1; // get the first port here var port = e.ports[0]; port.postMessage('A new connection! The current connection number is ' + connect_number); port.onmessage = function(e) { // get instructions from requester var instruction; if(e.data.instruction) instruction = e.data.instruction; else instruction = e.data; //alert(document.getElementById("inputText").value); var results = execute_instruction(instruction); port.postMessage('Request: ' + instruction + ' Response ' + results + ' from shared worker...'); }; }; /* * this function will be used to execute the instructions send from requester * @param instruction @return */ function execute_instruction(instruction) { var result_value; // implement your logic here // execute the instruction... result_value = instruction; return result_value; }
四、总结
没有什么可以总结的,测试一下代码就明白了,共享线程中connect_number值在多个浏览器实例即多个客户端中是共享的,但专用线程只在本浏览器实例中共享,多个浏览器实例之间不能共享。
个人感觉共享线程在没有相应完善机制保证的情况下,很容易出同步问题,需要多加考虑再用。
五、相关资料
参考了网上比较多的这这篇文章,如下链接:
深入 HTML5 Web Worker 应用实践:多线程编程
相关推荐
**LPF结果**:针对特定类型的分析结果,可以使用专用的LPF文件格式进行存储和共享。 **光线轨迹结果可视化**:支持以动画形式展示光线在场景中的传播路径,帮助用户直观理解光路结构。 **Eulumdat/IESNLM-63/...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
15. **多线程处理器 (Multi-Threading Processor)**:能够同时处理多个线程的处理器,提高多任务处理能力。 16. **邮件附件 (Email Attachment)**:电子邮件中附加的文件,允许用户发送非文本信息,如图片、文档或...
- **3.4.1 application对象的常用方法**:用于全局共享数据,如设置全局变量。 - **3.4.2 用application制作留言板**:利用`application`对象存储留言内容。 - **3.5 out对象** - 用于向客户端输出文本内容,例如...
- JSP专用注释`<%-- --%>`,这种注释在编译后的Servlet中不可见。 - **2.6 JSP指令标签** - **2.6.1 page指令**:设置JSP页面的一些基本属性,如编码类型、错误处理页面等。 - **2.6.2 include指令标签**:用于...
首先,显卡(GPU)是电脑中用于处理图形和视频数据的专用处理器。在运行3D游戏或进行图形密集型任务时,GPU会全速运转,产生大量热量。当电脑需要散热时,内置的风扇会自动加速以帮助散热。因此,通过运行高负载的3D...
- 在多线程编程中,同步确保多个线程访问共享资源时不会发生冲突。 - 数据库同步可以确保不同数据库之间数据的一致性。 #### 7. refactor (重构) - **定义**: 重构是在不改变软件外部行为的前提下改进其内部结构...
未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把...
许多 RAR 命令,例如解压、测试和列表,都允许在压缩文件名中使用通配符。如 在压缩文件名掩码中没有指定扩展名,RAR 会认为是 .rar,所以 * 意味着所有 .rar 扩展名的压缩文件。如果你需要处理所有没有扩展名的...
4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器...
4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器...
4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器进行调试......