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

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

让策略程序真正并发执行,给JavaScript策略增加系统底层多线程支持

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

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

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

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

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

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


فنکشن1 ((نیندMilliseconds) { var sum = 0 کے لئے (var i = 0 ; i < 10 ; i++) { رقم += i نیند ((نیندMilliseconds) Log ((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请求:

فنکشن main() { تھریڈز = [ https://www.baidu.com”, “https://www.163.com”].map(function(url) { واپسیتھریڈ (فونکشن) لاگ ((GET, url) واپس HttpQuery(url) }، یو آر ایل) }) تھریڈز.forEach ((فنکشن ((ٹائڈ) { نوشتہ جاتthreadJoin ((شروع کریں)) }) }


### 等待线程执行结束回收资源并返回执行结果

以上例子中我们在main函数中最后使用了```__threadJoin```函数来等待并发的线程执行完毕,变量```ret```接收```__threadJoin```函数的返回值,我们打印了这个返回值,可以观察这个并发的线程执行的具体结果。

// id: تھریڈ ID,terminated: کیا اسے روکنے پر مجبور کیا گیا ہے,elapsed: وقت لگتا ہے ((نی سیکنڈ) ،ret: تھریڈ کی کارکردگی کی واپسی کی قیمت ret: {id:1,terminated:false,elapsed:2004884301,ret:45}


### 强制结束线程,并回收资源

فنکشن1 ((نیندMilliseconds) { var sum = 0 کے لئے (var i = 0 ; i < 10 ; i++) { رقم += i نیند ((نیندMilliseconds) Log ((sum:، رقم) }

return sum

}

فنکشن main() { var thread1Id = __Thread ((func1, 200) نیند ((1000) retThreadTerminate = __threadTerminate ((thread1Id) لاگ ((retThreadTerminate) // سچ }


还是以刚才的例子,在创建线程后,可以在等待1秒之后就强制终止线程执行。

### 线程间通信

线程间通信主要使用```__threadPostMessage```函数和```__threadPeekMessage```函数。我们来看以下简单例子:

function1 (() { var id = __threadId (() while (true) { var postMsg = ایڈیشن سے ایڈیشن: ایڈیشن + ایڈیشن + ایڈیشن کے تھریڈ فنکشن func1 کے پیغامات __threadPostMessage ((0, postMsg) // اہم تھریڈ میں پیغام بھیجتا ہے var peekMsg = __threadPeekMessage() // دوسرے موضوعات سے پیغامات وصول کریں Log ((پیک ایم ایس جی) Sleep ((5000) } }

فنکشن main() { var threadId = __thread ((func1)

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

}


```__threadPostMessage```函数用于向某个线程发送消息,第一个参数是具体发送到哪个线程的ID,第二个参数是发送的消息,可以是字符串、数值、数组、JSON对象等。可以在并发的线程函数中向主线程发送消息,主线程的ID定义为0。

```__threadPeekMessage```函数用于监听某个线程发送来的消息, 可以设置超时时间(毫秒数),也可以设置为0表示阻塞,一直监听到有消息才返回。

当然,除了并发的线程和主线程通信。并发的线程之间也可以直接相互通信。

### 在并发的线程执行函数中获取当前线程ID

在上面的例子中,使用了```var id = __threadId()```,```__threadId()```函数可以获取当前线程的ID。

### 共享线程间储存的变量

除了线程间的通信,还可以使用共享变量进行交互。

function testFunc (() { __threadSetData ((0, testFunc, 100) // موجودہ تھریڈ ماحول کو اسٹور کرتا ہے ، جس کی کلید کی قیمت testFunc کے لئے ہے: 100 لاگ ((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)

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

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