`
balance9
  • 浏览: 14661 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

测试html5专用线程与共享线程的区别

阅读更多

    这两天研究一下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 应用实践:多线程编程       

 

 

分享到:
评论

相关推荐

    SPEOS CAA V5 Based Light Modeling

    **LPF结果**:针对特定类型的分析结果,可以使用专用的LPF文件格式进行存储和共享。 **光线轨迹结果可视化**:支持以动画形式展示光线在场景中的传播路径,帮助用户直观理解光路结构。 **Eulumdat/IESNLM-63/...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    计算机专业英语_考试题目.pdf

    15. **多线程处理器 (Multi-Threading Processor)**:能够同时处理多个线程的处理器,提高多任务处理能力。 16. **邮件附件 (Email Attachment)**:电子邮件中附加的文件,允许用户发送非文本信息,如图片、文档或...

    JSP教程——必看.pdf

    - **3.4.1 application对象的常用方法**:用于全局共享数据,如设置全局变量。 - **3.4.2 用application制作留言板**:利用`application`对象存储留言内容。 - **3.5 out对象** - 用于向客户端输出文本内容,例如...

    jsp 简易教程

    - JSP专用注释`&lt;%-- --%&gt;`,这种注释在编译后的Servlet中不可见。 - **2.6 JSP指令标签** - **2.6.1 page指令**:设置JSP页面的一些基本属性,如编码类型、错误处理页面等。 - **2.6.2 include指令标签**:用于...

    用显卡加速,轻松把笔记本打造成取暖器的办法!

    首先,显卡(GPU)是电脑中用于处理图形和视频数据的专用处理器。在运行3D游戏或进行图形密集型任务时,GPU会全速运转,产生大量热量。当电脑需要散热时,内置的风扇会自动加速以帮助散热。因此,通过运行高负载的3D...

    程序员英语词汇(个人整理版)

    - 在多线程编程中,同步确保多个线程访问共享资源时不会发生冲突。 - 数据库同步可以确保不同数据库之间数据的一致性。 #### 7. refactor (重构) - **定义**: 重构是在不改变软件外部行为的前提下改进其内部结构...

    C#微软培训资料

    未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把...

    rar压缩软件.rar

    许多 RAR 命令,例如解压、测试和列表,都允许在压缩文件名中使用通配符。如 在压缩文件名掩码中没有指定扩展名,RAR 会认为是 .rar,所以 * 意味着所有 .rar 扩展名的压缩文件。如果你需要处理所有没有扩展名的...

    Eclipse权威开发指南3.pdf

    4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器...

    Eclipse权威开发指南1.pdf

    4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器...

    Eclipse权威开发指南2.pdf

    4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 4.2.3 修改变量和字段的值..... 116 4.2.4 使用Java编辑器进行调试......

Global site tag (gtag.js) - Google Analytics