强型闯入DenoLand[26] - 使用 Deno 打造多线程应用(3)

Node.js之父新专案Deno 1.0正式亮相| iThome

强型闯入DenoLand[26] - 使用 Deno 打造多线程应用(3)

在介绍完多线程的概念以及如何在 Deno 上实现多线程後,就让我们来实做一些(不)好玩的城式吧!

题目

题目来源: 我大北科计算机牛逼组的作业系统课程作业。

  1. Coding independent threads can speed up the running of programs. Let us conduct an ex- periment to experience the features and skill of multithreading. You need to code two differ- ent styles of programs to perform a “matrix multiplication” in the same programming lan- guage (e.g. C language), as follows.

首先,依照题目要求,我们需要先生出两个矩阵,笔者在这边写了一个 CallBack Function ,让它输入位置後可以直接回传矩阵中该位置的值:

// index.ts
let a = function(i: number,j: number): number{
	return 3.5*i+(-6.6*j)
	}
function b(i: number,j: number) :number{
	return 6.6+(8.8*i)-3.5*j
	}

接着,我们写一个 Function 让它可以实现将两个不同矩阵中的值相乘并回传其值:

// index.ts
let a = function(i: number,j: number): number{
	return 3.5*i+(-6.6*j)
	}
function b(i: number,j: number) :number{
	return 6.6+(8.8*i)-3.5*j
	}
function MatrixC(i :number,j :number){
	let result = 0;
	for (var x = 1; x <= 60; x++) {
		let c = a(i,x)*b(x,j)
		result = result + c;
	}
	return result
}
export { a,b,MatrixC }

题目中要求我们需要分别使用 for-loopmulti-thread 的方法实现出功能。

For-loop

import { MatrixC } from './index.ts';
let count = 0;
function run(){
	for (var i = 1;i<=35; i++) {
		for (var j = 1; j<=35; j++) {
		let result = MatrixC(i,j);
		console.log(`C[${i},${j}]:${result}`)
        }
	}
}

我们可以直接使用双重回圈暴力硬解。

Multi-Thread

像是昨天教学中 main.ts 负责新增线程、 worker.ts 负责单一任务,我们在本题目的实作也依照这个逻辑拆分出两个档案:

// main.ts
(function(){
	for (var i = 1;i<=35; i++) {
	const worker = new Worker(new URL("worker.ts", import.meta.url).href, { type: "module" });
	worker.postMessage(i); 
	}
})();
// worker.ts
import { MatrixC } from './index.ts';

self.onmessage = (e) => {
	for (var j = 1;j<=35; j++) {
			let result = MatrixC(e.data,j);
			console.log(`C[${e.data},${j}]:${result}`)
		}
	self.close();
  };

实作上的逻辑非常简单,笔者只是将 for-loop 版本的第一层回圈拆掉并改用 workers 实作,当初在做这一题的时候花费最多时间的其实是复习矩阵相乘,而不是实现逻辑 XD

多线程真的比较快吗?

如果各位读者也跟着实作了该范例,会发现 for-loop 的版本其实快上不少...

最根本的原因是在这次多线程的实作上开了太多执行绪,反而拖累了程序的执行效率,如果读者有兴趣也可以改成派发 57 个线程并在 worker.ts 上多加一层 for-loop ,如果发现效果有显着提升欢迎到留言区分享(?)

或是各位读者也可以改用 C 语言实作,速度真的快上非常多 ORZ

总结

会特别花多达三篇的篇幅介绍多线程,其实是因为笔者想要跟大家分享着名的 C10K 问题,该问题在20年前被提出,主要的问题大概是:

即使硬体的性能符合要求,服务器仍无法同时处理 10000 个客户端的连线请求,也就是 10000 个并发连结问题。

其实多线程就是解决并发连线问题的方法之一,原因笔者也在前天的文章提到:

响应快,不像单一执行绪会因为单一执行绪停摆造成应用程序崩溃。

商业逻辑只要是学过程序语言的人都能实现,但是并不是人人都能将资料结构、演算法或是计算机科学领域的知识应用到其中。这也是笔者希望藉由这次铁人赛向其他跨领域的程序新手传达的知识。

当然啦!板上有很多比笔者我还强的大大,如果文章内容有误,也非常欢迎来信/留言指教。

最後,其实 C10K 问题已经退流行了,现在的顶尖开发者要面对的应该是 C10M 问题(1000万人同时连线)XDD

延伸阅读

同样的事情在不同人眼中可能会有不同的见解、看法。

在读完本篇以後,笔者也强烈建议大家去看看以下文章,或许会对型别、变数宣告...等观念有更深层的看法唷!


<<:  [LeetCode30] Day27 - 42. Trapping Rain Water

>>:  Android Studio 菜鸟笔记本-Day 27-BottomNavigationView的应用

[Day27] HTB Legacy

URL : https://app.hackthebox.eu/machines/2 IP : 1...

[第七只羊] 迷雾森林舞会前夕 建立使用者关联

天亮了 昨晚是平安夜 关於迷雾森林故事 秘密通道 Rocky 循着发光的脚印继续寻找爸爸妈妈的下落 ...

Python - Scrabble Word Finder - Python 爬虫练习笔记

Python - Scrabble Word Finder - Python 爬虫练习笔记 参考资料...

Day 5 学习前人的隐私条款设计

Day 4提到过往我们如何拟出一份适用符合内部及市场的隐私条款,今天还是以隐私条款为主要探讨方向,在...