وسائل لوڈ ہو رہے ہیں... لوڈنگ...

جاوا اسکرپٹ ملٹی تھریڈنگ سپورٹ کے ساتھ بیک وقت حکمت عملی پر عملدرآمد

مصنف:FMZ~Lydia, تخلیق: 2023-03-07 15:12:04, تازہ کاری: 2023-09-18 20:04:21

img

حکمت عملی پروگرام بیک وقت پھانسی دی جائے، اور جاوا سکرپٹ کی حکمت عملی کے نظام کے نچلے حصے میں کثیر موضوع کی حمایت شامل کریں

ایف ایم زیڈ پر جاوا اسکرپٹ زبان کا استعمال کرتے ہوئے حکمت عملی تیار کرتے وقت ، چونکہ حکمت عملی کی فن تعمیر کا جائزہ لیا جاتا ہے۔ اگر بیک وقت ڈیزائن کا منظرنامہ موجود ہے تو ،exchange.Goفنکشن کا استعمال کچھ انٹرفیسز کو بیک وقت کال کرنے کے لئے کیا جاتا ہے ، تاکہ کچھ بیک وقت منظرناموں کی ضروریات کو پورا کیا جاسکے۔ لیکن اگر آپ ایک سلسلہ کارروائیوں کو انجام دینے کے لئے ایک ہی تھریڈ بنانا چاہتے ہیں تو ، یہ ناممکن ہے۔ مثال کے طور پر ، پائتھون زبان کی طرح ،threadingلائبریری کچھ بیک وقت ڈیزائن کرنے کے لئے.

اس ضرورت کی بنیاد پر ، ایف ایم زیڈ پلیٹ فارم نے سسٹم کی نچلی پرت کو اپ گریڈ کیا ہے۔ جاوا اسکرپٹ زبان میں حقیقی ملٹی تھریڈنگ سپورٹ بھی شامل کی گئی ہے۔ تفصیلی خصوصیات میں شامل ہیں:

  • اپنی مرضی کے مطابق افعال کو بیک وقت انجام دینے کے لئے موضوعات بنائیں.
  • انٹر تھریڈ مواصلات.
  • مشترکہ موضوعات کے درمیان ذخیرہ متغیرات.
  • وسائل کو دوبارہ حاصل کرنے اور عملدرآمد کا نتیجہ واپس کرنے کے لئے تھریڈ کے عمل کو ختم کرنے کا انتظار کریں۔
  • طاقت کے ساتھ اس سلسلے کو ختم کریں اور وسائل واپس لیں.
  • موجودہ تھریڈ ID متوازی تھریڈ عملدرآمد فنکشن میں حاصل کریں.

اگلا، میں آپ کو ہر فنکشن کو ایک ایک کرکے سمجھنے کے لیے لے جاؤں گا۔

بیک وقت اپنی مرضی کے مطابق افعال انجام دینے کے لیے تھریڈز بنائیں

کے__Threadfunction ایک تھریڈ تشکیل دے سکتا ہے اور بیک وقت ایک فنکشن انجام دے سکتا ہے۔ مثال کے طور پر، آپ کو ایک بیک وقت فنکشن تشکیل دینے کی ضرورت ہےfunc1، کیا کرتا ہےfunc1فنکشن کیا کرتا ہے؟ ہم اسے 0 سے 9 تک جمع ہونے دے سکتے ہیں۔ بتدریج جمع ہونے کے عمل کو دیکھنے کے ل we ، ہم ہر بار روکنے کے لئے fun1 فنکشن میں for لوپ کا استعمال کرتے ہیں (سلیپ فنکشن کو ایک خاص تعداد میں ملی سیکنڈ کے لئے سوتے ہوئے استعمال کیا جاتا ہے) ایک خاص مدت کے لئے۔

function func1(sleepMilliseconds) {
    var sum = 0 
    for (var i = 0 ; i < 10 ; i++) {
        sum += i 
        Sleep(sleepMilliseconds)
        Log("sum:", sum)
    }
    
    return sum
}

function main() {
    // Use the __Thread function to create a thread concurrently, and the parameter 200 is the parameter of the func1 function,
    // If the func1 function has multiple parameters, here we pass the corresponding parameters.
    var thread1Id = __Thread(func1, 200)
    
    // Here we need to wait for the execution result of the thread whose thread Id is thread1Id, otherwise all threads will be released directly after the main function is executed.
    var ret = __threadJoin(thread1Id)
    Log("ret:", ret)
}

عملی ایپلی کیشنز میں، ہم HTTP درخواستیں بیک وقت اس طرح بنا سکتے ہیں:

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فنکشن میں اہم فنکشن آخر میں متوازی موضوعات کو ختم کرنے کے لئے انتظار کرنے کے لئے. متغیرretکی واپسی کی قیمت حاصل کرتا ہے__threadJoinتقریب، اور ہم واپسی کی قیمت پرنٹ، ہم متوازی دھاگے کے عملدرآمد کے مخصوص نتائج کا مشاہدہ کر سکتے ہیں.

// id: thread ID, terminated: whether it was forced to stop, elapsed: time-consuming (nanoseconds), ret: the return value of the thread execution function
ret: {"id":1,"terminated":false,"elapsed":2004884301,"ret":45}

طاقت کے ساتھ تھریڈ ختم کریں اور وسائل واپس لیں

function func1(sleepMilliseconds) {
    var sum = 0 
    for (var i = 0 ; i < 10 ; i++) {
        sum += i 
        Sleep(sleepMilliseconds)
        Log("sum:", sum)
    }
    
    return sum
}

function main() {
    var thread1Id = __Thread(func1, 200)
    Sleep(1000)
    retThreadTerminate = __threadTerminate(thread1Id)
    Log(retThreadTerminate)   // true
}

ہم ابھی بھی مثال استعمال کرتے ہیں، تھریڈ بنانے کے بعد، آپ 1 سیکنڈ انتظار کرنے کے بعد تھریڈ کی عملدرآمد کو زبردستی ختم کر سکتے ہیں۔

انٹر تھریڈ مواصلات

انٹر تھریڈ مواصلات بنیادی طور پر استعمال کرتا ہے__threadPostMessageفنکشن اور__threadPeekMessageفنکشن۔ آئیے مندرجہ ذیل سادہ مثال پر نظر ڈالیں:

function func1() {
    var id = __threadId()
    while (true) {
        var postMsg = "Message from thread function func1" with "from id:" + id + 
        __threadPostMessage(0, postMsg)              // Send a message to the main thread
        var peekMsg = __threadPeekMessage(0)         // Receive messages from the main thread
        Log(peekMsg)
        Sleep(5000)
    }
}

function main() {
    var threadId = __Thread(func1)
    
    while (true) {
        var postMsg = "Messages from the main function of the main thread"
        __threadPostMessage(threadId, postMsg)
        var peekMsg = __threadPeekMessage(threadId)
        Log(peekMsg, "#FF0000")                     // #FF0000 , Set the log to red for distinction
        Sleep(5000)
    }
}

کے__threadPostMessageایک تھریڈ میں پیغام بھیجنے کے لئے فنکشن کا استعمال کیا جاتا ہے۔ پہلا پیرامیٹر مخصوص تھریڈ کی شناخت ہے جس کو بھیجنا ہے ، اور دوسرا پیرامیٹر پیغام بھیجنا ہے ، جو ایک تار ، قدر ، صف ، یا JSON آبجیکٹ وغیرہ ہوسکتا ہے۔ پیغامات کو متوازی تھریڈ افعال میں مرکزی تھریڈ میں بھیجا جاسکتا ہے ، اور مرکزی تھریڈ کی شناخت 0 کے طور پر بیان کی گئی ہے۔

کے__threadPeekMessageایک مخصوص تھریڈ کے ذریعہ بھیجے گئے پیغام کی نگرانی کے لئے فنکشن کا استعمال کیا جاتا ہے۔ پہلا پیرامیٹر تھریڈ کی مخصوص شناخت کی نگرانی کرنا ہے۔ دوسرا پیرامیٹر ٹائم آؤٹ ٹائم (ملسی سیکنڈ میں) مقرر کرسکتا ہے ، یا اسے -1 پر مقرر کیا جاسکتا ہے ، جس کا مطلب ہے کہ بلاک کرنا ، اور جب تک کوئی پیغام نہیں آتا ہے وہ واپس نہیں آئے گا۔ ہم متوازی تھریڈ فنکشن میں موجودہ تھریڈ کو مین تھریڈ کے ذریعہ بھیجے گئے پیغام کو سن سکتے ہیں ، اور مین تھریڈ کی شناخت 0 کے طور پر بیان کی گئی ہے۔

یقیناً، اس کے علاوہ جو متوازی تھریڈز مین تھریڈ کے ساتھ بات چیت کرتے ہیں۔ متوازی تھریڈز بھی ایک دوسرے کے ساتھ براہ راست بات چیت کر سکتے ہیں۔

موجودہ تھریڈ ID متوازی تھریڈ عملدرآمد فنکشن میں حاصل کریں

مندرجہ بالا مثال میں،var id = __threadId()استعمال کیا جاتا ہے، اور__threadId()تقریب موجودہ موضوع کی شناخت حاصل کر سکتے ہیں.

مشترکہ موضوعات کے درمیان ذخیرہ شدہ متغیرات

موضوعات کے مابین مواصلات کے علاوہ ، مشترکہ متغیرات کو بھی تعامل کے لئے استعمال کیا جاسکتا ہے۔

function testFunc() {
    __threadSetData(0, "testFunc", 100)   // Stored in the current thread environment, key-value pair testFunc : 100
    Log("testFunc execution completed")
}

function main() {
    // threadId is 1, the created thread with threadId 1 will be executed first, as long as the thread resources are not reclaimed, the variables stored locally in the thread will be valid
    var testThread = __Thread(testFunc)
    
    Sleep(1000)

    // export in main, get testFunc: 100
    Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))   // Take out the value whose key name is testFunc
}

مندرجہ بالا تمام افعال کا ایک سادہ مظاہرہ ہے۔ آئیے تھوڑی زیادہ پیچیدہ ٹیسٹ مثال پر نظر ڈالیں۔

مقامی ملٹی تھریڈڈ جاوا اسکرپٹ اور WASM کے درمیان کارکردگی کا موازنہ

اس ٹیسٹ کی حکمت عملی کا پتہ:https://www.fmz.com/strategy/401463

ایک نظر میں ، آپ کو معلوم نہیں ہوسکتا ہے کہ یہ ٹیسٹ کی حکمت عملی کیا کرتی ہے۔ اس سے کوئی فرق نہیں پڑتا ، آئیے اس کی وضاحت کریں۔ پہلے ، آئیے سیکھیں کہ WASM کیا ہے۔

WebAssemblyہےWASM, WebAssemblyایک نیا کوڈنگ فارمیٹ ہے اور براؤزر میں چل سکتا ہے،WASMکے ساتھ استعمال کیا جا سکتا ہےJavaScriptساتھ ساتھ موجود ہے، اور WASM ایک کم سطح اسمبلی زبان کی طرح زیادہ ہے.

اس کے بعد ٹیسٹ کی حکمت عملی wasm اور جاوا اسکرپٹ کی کارکردگی کا موازنہ کرنا ہے ، لیکن موازنہ کرتے وقت ، دونوں عملدرآمد کے طریقوں کو متواتر عمل میں لایا جاسکتا ہے ، اور ہر ایک کا وقت طلب شمار کیا جاتا ہے۔ یہ بھی ممکن ہے کہ دونوں عملدرآمد کے طریقوں کو بیک وقت عملدرآمد کرنے کی اجازت دی جائے ، اور اعدادوشمار وقت طلب ہیں۔ اب جب جاوا اسکرپٹ زبان کی حکمت عملی کے بنیادی ہم وقت سازی کے نفاذ کی حمایت کی گئی ہے تو ، ٹیسٹ کی حکمت عملی قدرتی طور پر موازنہ کرنے اور ایک ہی الگورتھم کی عملدرآمد کی رفتار کا موازنہ کرنے کے لئے بیک وقت طریقہ استعمال کرتی ہے۔

  • C زبان ورژن کا الگورتھم، fib فنکشن
// Recursive algorithm of Fibonacci Numbers in C Language
int fib(int f) {
    if (f < 2) return f;
    return fib(f - 1) + fib(f - 2);
}
  • الگورتھم کا جاوا اسکرپٹ زبان ورژن، fib فنکشن
// A recursive algorithm for the same Fibonacci numbers, written in JavaScript
function fib(f) {
    if (f < 2) return f
    return fib(f - 1) + fib(f - 2)
}

یہ دیکھا جاسکتا ہے کہ دونوں فیب فنکشن الگورتھم کی منطق بالکل ایک جیسی ہے۔ مندرجہ ذیل ٹیسٹ کی حکمت عملی کا سورس کوڈ ہے:

function main() {
    // In order to make it easier to see the code, I write the comment on the following code directly:
    let cycle = 100    // The test executes the loop 100 times
    let input = 30     // The parameters that will be passed to the algorithm fib function
    let threads = [
        __Thread(function(cycle, input) {           // A thread is created concurrently to perform calculations using the JavaScript version of the fib function
            function fib(f) {                       // The specific algorithm used for testing, the fib function
                if (f < 2) return f
                return fib(f - 1) + fib(f - 2)
            }
            let ret = 0
            for (let i = 0; i < cycle; i++) {       // loop for 100 times 
                ret = fib(input);                   // Call the fib function of the JavaScript language 
                Log("javascript progress: ", i)
            }
            return 'javascript fib: ' + ret
        }, cycle, input),
        
        __Thread(function(cycle, input) {           // Run a thread concurrently to perform calculations using the wasm version of the fib function
            let data = 'data:hex,0061736d010000000186808080000160017f017f0382808080000100048480808000017000000583808080000100010681808080000007908080800002066d656d6f727902000366696200000aa480808000019e80808000000240200041024e0d0020000f0b2000417f6a10002000417e6a10006a0b'
            let m = wasm.parseModule(data)          // The data variable is the hex string of the wasm-encoded C language fib function, and the wasm model m is created using wasm.parseModule

            let instance = wasm.buildInstance(m, {  // Model instantiation, allocate a certain stack space
                stack_size: 65 * 1024 * 1024,
            })

            let ret = 0
            for (let i = 0; i < cycle; i++) {                // loop for 100 times 
                ret = instance.callFunction('fib', input)    // Calling the fib function code in the wasm instance is equivalent to calling the int fib(int f) function 
                Log("wasm progress: ", i)
            }

            return 'wasm fib: ' + ret
        }, cycle, input)
    ]
    
    // The elements in the threads array are the IDs returned by the __Thread function
    threads.forEach(function(tid) {
        let info = __threadJoin(tid)                         // Use the __threadJoin function to wait for two concurrent threads to execute and get the execution result
        Log('#'+tid, info.ret, 'elapsed:', info.elapsed / 1e6, "#ff0000")   // output execution result
    })
}

سادہ الفاظ میں ، WASM ایک اعلی کارکردگی کا مظاہرہ کرنے والا پروگرام کوڈ ہے۔ مثال کے طور پر ، ہم فبونیکی نمبر ریکوریسیو الگورتھم کے سی زبان کے کوڈ کو WASM میں تبدیل کرتے ہیں۔ عمل اس طرح ہے:

  1. C زبان کے فنکشن کوڈ کا ایک ٹکڑا wasm کوڈ میں مرتب کریں.

ہم ویب سائٹ کو تبدیل کرنے کے لئے استعمال کر سکتے ہیں:https://wasdk.github.io/WasmFiddle/

// Recursive Algorithm of Fibonacci numbers in C Language
int fib(int f) {
    if (f < 2) return f;
    return fib(f - 1) + fib(f - 2);
}
  1. مزید hex تار میں wasm کوڈ کوڈ.

مندرجہ ذیل کمانڈز استعمال کیے جا سکتے ہیں:

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

کوڈت hex تار ہےlet data = 'data:hex,0061736d0100000001868...کوڈ میں.

  1. اس کے بعد اس فنکشن کے ذریعے ایک wasm ماڈل میں تجزیہwasm.parseModule()ایف ایم زیڈ کی طرف سے ضم.

  2. فنکشن کے ذریعے wasm ماڈل مثال بنائیںwasm.buildInstance()ایف ایم زیڈ کی طرف سے ضم.

  3. پھر کال کریںfibاس wasm ماڈل مثال میں تقریب، یعنی:ret = instance.callFunction('fib', input).

ٹیسٹ چلانے کے لئے ایک حقیقی بوٹ بنائیں

یہ ٹیسٹ حکمت عملی صرف حقیقی بوٹ ٹیسٹنگ کے لئے استعمال کی جاسکتی ہے۔ جاوا اسکرپٹ ملٹی تھریڈنگ افعال ابھی تک بیک ٹیسٹنگ کی حمایت نہیں کرتے ہیں۔

wasmاورJavaScriptعملدرآمد کا موازنہ، عملدرآمد کے حتمی نتائج:

2023-03-06 11:00:33		infomation	#2 wasm fib: 832040 elapsed: 13283.773019
2023-03-06 11:00:33		infomation	#1 javascript fib: 832040 elapsed: 21266.326974

ایسا لگتا ہے کہwasmکم وقت لیتا ہے اور بہتر ہے.


متعلقہ

مزید