首先,如果你不熟悉這個(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ù)。
新聞熱點(diǎn)
疑難解答
圖片精選