मूल बहु-थ्रेड जावास्क्रिप्ट और WASM प्रदर्शन की तुलना

लेखक:आविष्कारक मात्रा, दिनांक: 2023-02-23 17:35:24
टैगःमल्टी थ्रेड

आविष्कारकों ने मूल रूप से निम्न स्तर से जावास्क्रिप्ट को वास्तविक अर्थपूर्ण बहु-थ्रेड का समर्थन करने का प्रयास किया, और WASM सुविधाओं को शामिल किया, नीचे एक डेमो है जिसे नवीनतम होस्ट डाउनलोड करने के लिए एक स्वादिष्ट अनुभव है यह एक गैर-जावास्क्रिप्ट वर्कर फ़ंक्शन है जिसका उपयोग कई थ्रेडों के बीच या मुख्य थ्रेड के साथ संवाद करने के लिए किया जा सकता है।

C भाषा में अनुवाद करने के लिए, आप इस वेबसाइट से परीक्षण उत्पन्न कर सकते हैंःhttps://wasdk.github.io/WasmFiddle/

C भाषा का कोड जो wasm के रूप में संकलित किया गया है

int fib(int f) {
  if (f < 2) return f;
  return fib(f - 1) + fib(f - 2);
}

संकलित करने के बाद wasm फ़ाइल डाउनलोड करें और फिर इसे पायथन में हेक्स स्ट्रिंग में परिवर्तित करें

python -c "print('data:hex,'+bytes.hex(open('program.wasm','rb').read()))"

कोड में चर के पीछे की सामग्री को प्रतिस्थापित करें

__थ्रेड ((फंक्शन, तर्क...)

थ्रेड बनाएं और थ्रेडtid लौटाएं, स्वीकार किए गए थ्रेड के मुख्य फ़ंक्शन के फ़ंक्शन को थ्रेड फ़ंक्शन के भीतर सभी फ़ंक्शन कोड को पूरा करना होगा, अन्य क्लोजर फ़ंक्शन संदर्भों का समर्थन नहीं करता है, थ्रेड के भीतर सभी प्लेटफॉर्म एपीआई को बुलाया जा सकता है, लेकिन उपयोगकर्ता द्वारा अनुकूलित अन्य फ़ंक्शन नहीं बुला सकते हैं

एक सरल उदाहरणः

let tid = __Thread(function(x, y) {
    return x + y
}, 1, 2)
Log(__threadJoin(tid))

मल्टी-थ्रेड अनुरोधों के उदाहरणः

function main() {
    let threads = [
        "https://www.baidu.com",
        "https://www.163.com"
    ].map(function(url) {
        return __Thread(function(url) {
            Log("GET", url)
            return HttpQuery(url)
        }, url)
    })
    threads.forEach(function(tid) {
        Log(__threadJoin(tid))
    })
}

थ्रेड के स्थानीय भंडारण चर

थ्रेड के स्थानीय भंडारण चर का समर्थन करता है, ताकि डेटा को आसानी से साझा किया जा सके।__threadJoinया तो सफल निकासी की प्रतीक्षा करें या__threadTerminateसमाप्ति के मामले में प्रभावी

__threadGetData(tid, key)
__threadSetData(tid, key, value)

tid 0 वर्तमान थ्रेड को दर्शाता है, value निर्दिष्ट नहीं करता है, delete key को दर्शाता है, एक दूसरे के बीच साझा किए जाने वाले चर का समर्थन करता है, जो एक क्रमबद्ध चर होना चाहिए

तार संचार

__threadPostMessage(tid, msg) // 向指定线程发送消息, tid为0是向主线程即当前主函数发送, 在线程内部调用指向主线程回复消息, 该消息可以被EventLoop捕获
__threadPeekMessage(tid, timeout) // 从指定线程接收消息, 如果不指定timeout(毫秒)就一直等待, tid为0指等待主线程的消息

__threadJoin ((टाइड, टाइमआउट)

थ्रेड के अंत का इंतजार करें निर्दिष्ट timeout ((मिलीसेकंड) निर्दिष्ट करने के लिए प्रतीक्षा समय से अधिक समय तक प्रतीक्षा करें या निर्दिष्ट न करें या थ्रेड के अंत तक प्रतीक्षा करें, सफलतापूर्वक फ़ंक्शन को वापस करने वाले मान वाले संरचना को वापस करें और संसाधनों को पुनर्प्राप्त करें, संरचना इस प्रकार हैः

{
    id: tid, // 线程id
    elapsed: 1111, // 线程的运行时间(纳秒)
    terminated: false, // 线程是否被强制结束 
    ret: 123, // 线程函数的返回值
}

यदि ओवरटाइम वापस undefined

__थ्रेडसमाप्त करना

थ्रेड को समाप्त करना और संसाधनों को पुनः प्राप्त करना (__threadJoin का उपयोग समाप्त होने तक नहीं किया जा सकता)

ध्यान दें

__Thread का फ़ंक्शन फ़ंक्शन के बाहर के चर का संदर्भ नहीं देता है (एक अलग वातावरण के रूप में काम करता है), बाहरी चर का संदर्भ लेने से संकलन विफल हो जाएगा


function main() {
    let cycle = 100
    let input = 30
    let threads = [
        __Thread(function(cycle, input) {
            function fib(f) {
                if (f < 2) return f
                return fib(f - 1) + fib(f - 2)
            }
            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = fib(input);
                Log("javascript progress: ", i)
            }
            return 'javascript fib: ' + ret
        }, cycle, input),
        
        __Thread(function(cycle, input) {
            let data = 'data:hex,0061736d010000000186808080000160017f017f0382808080000100048480808000017000000583808080000100010681808080000007908080800002066d656d6f727902000366696200000aa480808000019e80808000000240200041024e0d0020000f0b2000417f6a10002000417e6a10006a0b'
            let m = wasm.parseModule(data)

            let instance = wasm.buildInstance(m, {
                stack_size: 65 * 1024 * 1024,
            })

            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = instance.callFunction('fib', input)
                Log("wasm progress: ", i)
            }

            return 'wasm fib: ' + ret
        }, cycle, input)
    ]

    threads.forEach(function(tid) {
        let info = __threadJoin(tid)
        Log('#'+tid, info.ret, 'elapsed:', info.elapsed / 1e6, "#ff0000")
    })
}

संबंधित

अधिक

अस्थि चाकूचलाने का सुझावः त्रुटि ReferenceError: '__Thread' is not defined at main (FILE:5)

आविष्कारक मात्रानवीनतम होस्ट में अपग्रेड करें