国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript多線程運(yùn)行庫Nexus.js詳解

2024-05-06 15:23:20
字體:
供稿:網(wǎng)友

首先,如果你不熟悉這個(gè)項(xiàng)目,建議先閱讀之前寫的一系列文章。如果你不想閱讀這些,不用擔(dān)心。這里面也會(huì)涉及到那些內(nèi)容。

現(xiàn)在,讓我們開始吧。

去年,我開始實(shí)現(xiàn)Nexus.js,這是一個(gè)基于Webkit/JavaScript內(nèi)核的多線程服務(wù)端JavaScript運(yùn)行庫。有一段時(shí)間我放棄了做這件事,由于一些我無法控制的原因,我不打算在這里討論,主要是:我無法讓自己長(zhǎng)時(shí)間工作。

所以,讓我們從討論Nexus的架構(gòu)開始,以及它是如何工作的。

事件循環(huán)

沒有事件循環(huán)

有一個(gè)帶有(無鎖)任務(wù)對(duì)象的線程池

每次調(diào)用setTimeout或setImmediate或創(chuàng)建一個(gè)Promise時(shí),任務(wù)就排隊(duì)到任務(wù)隊(duì)列鐘。

每當(dāng)計(jì)劃任務(wù)時(shí),第一個(gè)可用的線程將選擇任務(wù)并執(zhí)行它。

在CPU內(nèi)核上處理Promise。對(duì)Promise.all()的調(diào)用將并行的解決Promise。

ES6

支持async/await,并且推薦使用

支持for await(...)

支持解構(gòu)

支持async try/catch/finally

模塊

不支持CommonJS。(require(...)和module.exports)

所有模塊使用ES6的import/export語法

支持動(dòng)態(tài)導(dǎo)入通過import('file-or-packge').then(...)

支持import.meta,例如:import.meta.filename以及import.meta.dirname等等

附加功能:支持直接從URL中導(dǎo)入,例如:

import { h } from 'https://unpkg.com/preact/dist/preact.esm.js';

EventEmitter

Nexus實(shí)現(xiàn)了基于Promise的EventEmitter類

事件處理程序在所有線程上排序,并將并行處理執(zhí)行。

EventEmitter.emit(...)的返回值是一個(gè)Promise,它可以被解析為在事件處理器中返回值所構(gòu)成的數(shù)組。

例如:

class EmitterTest extends Nexus.EventEmitter { constructor() {  super();  for(let i = 0; i < 4; i++)   this.on('test', value => { console.log(`fired test ${i}!`); console.inspect(value); });  for(let i = 0; i < 4; i++)   this.on('returns-a-value', v => `${v + i}`); }}const test = new EmitterTest();async function start() { await test.emit('test', { payload: 'test 1' }); console.log('first test done!'); await test.emit('test', { payload: 'test 2' }); console.log('second test done!'); const values = await test.emit('returns-a-value', 10); console.log('third test done, returned values are:'); console.inspect(values);}start().catch(console.error);

I/O

所有輸入/輸出都通過三個(gè)原語完成:Device,F(xiàn)ilter和Stream。

所有輸入/輸出原語都實(shí)現(xiàn)了EventEmitter類

要使用Device,你需要在Device之上創(chuàng)建一個(gè)ReadableStream或WritableStream

要操作數(shù)據(jù),可以將Filters添加到ReadableStream或WritableStream中。

最后,使用source.pipe(...destinationStreams),然后等待source.resume()來處理數(shù)據(jù)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 本溪| 新营市| 岳西县| 古田县| 习水县| 建水县| 潞城市| 巫山县| 文水县| 宜兰县| 达日县| 瓦房店市| 射洪县| 广南县| 贵阳市| 罗定市| 奉节县| 浠水县| 阳信县| 祁阳县| 弋阳县| 吕梁市| 长顺县| 东海县| 博兴县| 东光县| 曲阳县| 永德县| 太谷县| 滕州市| 三穗县| 偃师市| 织金县| 阳春市| 合川市| 开江县| 合作市| 昌都县| 万荣县| 滨州市| 商城县|