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

مصنف:چھوٹا سا خواب, تخلیق: 2023-03-02 14:19:15, تازہ کاری: 2024-03-20 15:06:41

img

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

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

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

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

اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے کہ کس طرح آپ کو اس کے بارے میں جاننے کی ضرورت ہے.

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

__Threadفنکشن ایک تھریڈ بنا سکتا ہے اور ایک فنکشن کو بیک وقت انجام دے سکتا ہے۔ مثال کے طور پر ، ایک متوازی فنکشن بنانا ضروری ہے۔func1func1فنکشن کیا کام کرتا ہے؟ ہم اسے 0 سے 9 تک جمع کر سکتے ہیں، اور اس کے ساتھ ساتھ اس عمل کو دیکھنے کے لئے، فنکشن func1 میں for loop کا استعمال کرتے ہوئے ہر بار روک دیا جاتا ہے.

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

function main() {
    // 使用__Thread函数并发创建一个线程,参数200即为func1函数的参数,
    // 如果func1函数有多个参数,这里就具体传对应的参数
    var thread1Id = __Thread(func1, 200)
    
    // 这里需要等待线程Id为thread1Id的线程执行结果,否则main函数执行完就直接释放所有线程
    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:线程ID,terminated:是否被强制停止,elapsed:耗时(纳秒),ret:线程执行函数的返回值
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
}

یا مثال کے طور پر، ایک تھریڈ بنانے کے بعد، ایک سیکنڈ کے انتظار کے بعد تھریڈ کو ختم کرنے پر مجبور کیا جا سکتا ہے۔

انٹرا وائرڈ مواصلات

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

function func1() {
    var id = __threadId()
    while (true) {
        var postMsg = "来自id:" + id + "的线程函数func1的消息"
        __threadPostMessage(0, postMsg)              // 发送消息到主线程
        var peekMsg = __threadPeekMessage()         // 接收来自其它线程的消息
        Log(peekMsg)
        Sleep(5000)
    }
}

function main() {
    var threadId = __Thread(func1)
    
    while (true) {
        var postMsg = "来自主线程的main函数的消息"
        __threadPostMessage(threadId, postMsg)
        var peekMsg = __threadPeekMessage()
        Log(peekMsg, "#FF0000")                     // #FF0000 , 设置日志为红色用于区分
        Sleep(5000)
    }
}

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

__threadPeekMessageیہ فنکشن کسی تھریڈ کے ذریعے بھیجے گئے پیغامات کی نگرانی کے لیے استعمال ہوتا ہے۔ اس میں ٹائم ٹائم (ملی سیکنڈ) یا بلاک کرنے کے لیے 0 مقرر کیا جا سکتا ہے۔

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

متوازی تھریڈ کے عملدرآمد میں موجودہ تھریڈ آئی ڈی حاصل کریں

اس مثال میں، یہ استعمال کیا جاتا ہےvar id = __threadId()__threadId()فنکشن موجودہ تھریڈ کا آئی ڈی حاصل کرسکتا ہے۔

مشترکہ دھاگوں کے درمیان ذخیرہ کردہ متغیرات

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

function testFunc() {
    __threadSetData(0, "testFunc", 100)   // 储存在当前线程环境,键值对 testFunc : 100 
    Log("testFunc执行完毕")
}

function main() {
    // threadId为1 ,创建的threadId为1的线程会先执行完,只要线程资源没有被回收,线程本地储存的变量就有效
    var testThread = __Thread(testFunc)
    
    Sleep(1000)

    // 输出 in main, get testFunc: 100
    Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))   // 取出键名为testFunc的值
}

یہ تمام خصوصیات کا ایک مختصر مظاہرہ ہے۔


متعلقہ

مزید

ہڈیوں کا چاقواس حکمت عملی کو چلانے کے لئے نقل کریں: غلطی ReferenceError: '__Thread' is not defined at main (__FILE__:5)

ہڈیوں کا چاقوجمع کرنا سیکھنا

ایجاد کنندہ کوانٹائزیشناپ گریڈ ٹاسٹر