在介绍完多线程的概念以及如何在 Deno 上实现多线程後,就让我们来实做一些(不)好玩的城式吧!
题目来源: 我大北科计算机牛逼组的作业系统课程作业。
首先,依照题目要求,我们需要先生出两个矩阵,笔者在这边写了一个 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-loop
、 multi-thread
的方法实现出功能。
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}`)
}
}
}
我们可以直接使用双重回圈暴力硬解。
像是昨天教学中 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
的版本其实快上不少...
最根本的原因是在这次多线程的实作上开了太多执行绪,反而拖累了程序的执行效率,如果读者有兴趣也可以改成派发 5
、7
个线程并在 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的应用
URL : https://app.hackthebox.eu/machines/2 IP : 1...
天亮了 昨晚是平安夜 关於迷雾森林故事 秘密通道 Rocky 循着发光的脚印继续寻找爸爸妈妈的下落 ...
Python - Scrabble Word Finder - Python 爬虫练习笔记 参考资料...
Day 4提到过往我们如何拟出一份适用符合内部及市场的隐私条款,今天还是以隐私条款为主要探讨方向,在...
此篇接续第一篇:https://ithelp.ithome.com.tw/articles/1026...