25

それで、Node.js に関するいくつかの資料を読んでいて、Worker Threadsに出くわしたときに驚きました。

私の意見では、スレッドを持つことは、特に共有メモリアクセスと組み合わせると、大きなプラスになります。あなたがすでに考えているように -> SharedArrayBuffer...

うん、そう思った。そのため、最初に頭に浮かんだのは、少しテストしてstore、スレッド間で共有される単純な (今のところ単純なオブジェクト) を実装しようとすることでした。

問題は、(ここで何かが欠けていない限り) を使用して n スレッドからオブジェクトにアクセスできるようにするにはどうすればよいかということですSharedArrayBuffer

私は単純なことができることを知っていUint32Arrayますが、オブジェクトに関して何ができるでしょうか?

最初は以下のように変換しようと思ったのUint32Arrayですが、いまいましいソースコードを見ただけでも泣きそうです...

const {
    Worker,
    isMainThread,
    workerData
} = require('worker_threads');

const store = {
    ks109: {
        title: 'some title 1',
        description: 'some desciption 1',
        keywords: ['one', 'two']
    },
    ks110: {
        title: 'some title 2',
        description: 'some desciption 2',
        keywords: ['three', 'four']
    },
    ks111: {
        title: 'some title 3',
        description: 'some desciption 3',
        keywords: ['five', 'six']
    }
}

const shareObject = (obj) => {

    let OString = JSON.stringify(obj);
    let SABuffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * OString.length);
    let sArray = new Int32Array(SABuffer);

    for (let i = 0; i < OString.length; i++) {
        sArray[i] = OString.charCodeAt(i);
    }

    return sArray;

}

if (isMainThread) {

    const sharedStore = shareObject(store);

    console.log('[Main][Data Before]:', sharedStore.slice(-10));

    let w = new Worker(__filename, {
        workerData: sharedStore
    });

    w.on('message', (msg) => {
        console.log(`[Main][Thread message]: ${msg}`);
    });
    w.on('error', (err) => {
        console.error(`[Main][Thread error] ${err.message}`);
    });
    w.on('exit', (code) => {
        if (code !== 0) {
            console.error(`[Main][Thread unexpected exit]: ${code}`);
        }
    });

    setInterval(() => {
        // At some point you ll see a value change,
        // it's 'six' becoming 'sax' (big time!) 
        console.log('[Main][Data Check]:', sharedStore.slice(-10));
    }, 1000);

} else {

    let str = String.fromCharCode.apply(this, workerData);
    let obj = JSON.parse(str);

    obj.ks111.keywords[1] = 'sax'; // big time!

    let OString = JSON.stringify(obj);

    for (let i = 0; i < OString.length; i++) {
        workerData[i] = OString.charCodeAt(i);
    }

}

結論として、Node.js 10.5.0 でスレッド間でオブジェクトを共有することは可能ですか? どのように?

4

1 に答える 1