পলিসি প্রোগ্রামগুলিকে সত্যিকারের সমান্তরালভাবে চালানোর জন্য, জাভাস্ক্রিপ্ট পলিসিগুলির জন্য সিস্টেমের নীচের স্তরে বহু-থ্রেড সমর্থন যুক্ত করুন

লেখক:ছোট্ট স্বপ্ন, সৃষ্টিঃ ২০২৩-০৩-০২ 14:19:15, আপডেটঃ ২০২৪-০৩-২০ 15:06:41

img

পলিসি প্রোগ্রামগুলিকে সত্যিকারের সমান্তরালভাবে চালানোর জন্য, জাভাস্ক্রিপ্ট পলিসিগুলির জন্য সিস্টেমের নীচের স্তরে বহু-থ্রেড সমর্থন যুক্ত করুন

জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে এফএমজেডে নীতিগুলি বিকাশ করার সময়, নীতির কাঠামোটি জিজ্ঞাসা করা হয়।exchange.Goফাংশনগুলিকে কিছু ইন্টারফেসের সাথে একযোগে কল করার জন্য ব্যবহার করা হয়, যা কিছু সমান্তরাল দৃশ্যের প্রয়োজন পূরণ করে। কিন্তু যদি আপনি সত্যিই একটি থ্রেড তৈরি করতে চান তবে এটি পৃথকভাবে একটি সিরিজ ক্রিয়াকলাপ সম্পাদন করা অসম্ভব, যেমন পাইথন ভাষার মতো।threadingআমি আমার কাজ শেষ করতে চাই।

এই চাহিদার ভিত্তিতে, এফএমজেড প্ল্যাটফর্মটি সিস্টেমের অন্তর্নিহিত স্তরকে আপগ্রেড করেছে। জাভাস্ক্রিপ্ট ভাষার জন্য সত্যিকারের মাল্টি-থ্রেড সমর্থনও যুক্ত করেছে। বিস্তারিত বৈশিষ্ট্যগুলির মধ্যে রয়েছেঃ

  • কাস্টম ফাংশন চালানোর জন্য থ্রেড তৈরি করুন।
  • এটি একটি অদ্ভুত ঘটনা।
  • শেয়ার করা থ্রেডগুলির মধ্যে সংরক্ষিত ভেরিয়েবলগুলি।
  • থ্রেডের এক্সিকিউশনের জন্য অপেক্ষা করুন পুনরুদ্ধার রিসোর্স শেষ এবং এক্সিকিউশন ফলাফল ফিরে আসে।
  • "এটি একটি দুর্ভাগ্যজনক ঘটনা, কারণ এটি একটি দুর্ভাগ্যজনক ঘটনা, এবং এটি একটি দুর্ভাগ্যজনক ঘটনা।
  • সমান্তরাল থ্রেড এক্সিকিউশন ফাংশনে বর্তমান থ্রেড আইডি পান।

এখানে আমরা আপনাকে প্রতিটি বৈশিষ্ট্য সম্পর্কে বিস্তারিতভাবে জানাবো।

কাস্টম ফাংশনগুলিকে থ্রেডের সাথে তৈরি করুন

__Threadএকটি ফাংশন একটি থ্রেড তৈরি করতে পারে এবং একই সাথে একটি ফাংশন সম্পাদন করতে পারে। উদাহরণস্বরূপ, একটি সমান্তরাল ফাংশন তৈরি করা প্রয়োজন।func1func1ফাংশনটি কী কাজ করে? আমরা এটিকে 0 থেকে 9 পর্যন্ত যোগ করতে পারি, এবং এই ধীরে ধীরে যোগ করার প্রক্রিয়াটি দেখতে, ফাংশন func1-এ for loop ব্যবহার করে প্রতিবার বিরতি দেওয়া হয় (Sleep ফাংশনটি নির্দিষ্ট মিলিসেকেন্ডের জন্য নিদ্রায় থাকে) ।

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)
}

বাস্তব অ্যাপ্লিকেশন ক্ষেত্রে, আমরা একই সময়ে এইচটিটিপি অনুরোধ করতে পারিঃ

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))
    })
}

থ্রেড এক্সিকিউশনের জন্য অপেক্ষা করুন পুনরুদ্ধার রিসোর্স শেষ এবং এক্সিকিউশন ফলাফল ফিরে

এই উদাহরণে আমরা main ফাংশনে শেষ ব্যবহার করেছি।__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
}

অথবা এই উদাহরণে, একটি থ্রেড তৈরি করার পরে, এটি 1 সেকেন্ড অপেক্ষা করার পরে জোর করে থ্রেডটি শেষ করতে পারে।

থ্রেডের মধ্যে যোগাযোগ

প্রধানত ইন্টারফেস যোগাযোগের জন্য ব্যবহৃত হয়__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)

হাড়ের ছুরিসংগ্রহ এবং শেখা

উদ্ভাবক পরিমাণআপগ্রেড করা ট্রাস্টি