
JavaScript زبان کا استعمال کرتے ہوئے FMZ پر حکمت عملی تیار کرتے وقت، حکمت عملی کا ڈھانچہ پولنگ ہے۔ اگر ہم آہنگی ڈیزائن کا منظر نامہ ہے، تو یہ ہے۔exchange.Goفنکشنز کا استعمال کچھ انٹرفیس پر ایک ساتھ کال کرنے کے لیے کیا جاتا ہے، اس طرح کچھ ہم آہنگی کے حالات کی ضروریات کو پورا کیا جاتا ہے۔ تاہم، اگر آپ آپریشنز کی ایک سیریز کو انجام دینے کے لیے ایک الگ تھریڈ بنانا چاہتے ہیں، تو یہ ممکن نہیں ہے، مثلاً Python میں، استعمال کریں۔threadingلائبریری کو کچھ ہم آہنگی ڈیزائن کرنے کے لیے استعمال کیا جاتا ہے۔
اس مطالبے کی بنیاد پر، FMZ پلیٹ فارم نے بنیادی نظام کو اپ گریڈ کیا۔ جاوا اسکرپٹ کی زبان میں حقیقی ملٹی تھریڈنگ سپورٹ بھی شامل کی گئی ہے۔ تفصیلی خصوصیات میں شامل ہیں:
اگلا، ایڈیٹر آپ کو ایک ایک کرکے ہر فنکشن کو سمجھنے کے لیے لے جائے گا۔
__Threadایک فنکشن بیک وقت کسی فنکشن کو انجام دینے کے لیے ایک تھریڈ بنا سکتا ہے۔ مثال کے طور پر، آپ کو ایک سمورتی فنکشن بنانے کی ضرورت ہے۔func1,func1فنکشن کیا کرتا ہے؟ ہم اسے 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
}
پچھلی مثال کو دوبارہ لیتے ہوئے، تھریڈ بنانے کے بعد، آپ 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 آبجیکٹ، وغیرہ۔ آپ کنکرنٹ تھریڈ فنکشن میں مین تھریڈ پر میسج بھیج سکتے ہیں مین تھریڈ کی ID 0 کے طور پر بیان کی گئی ہے۔
__threadPeekMessageفنکشن کا استعمال تھریڈ کے ذریعے بھیجے گئے پیغامات کی نگرانی کے لیے کیا جاتا ہے، آپ ٹائم آؤٹ (ملی سیکنڈ میں) سیٹ کر سکتے ہیں یا دھاگے کو بلاک کرنے کے لیے اسے 0 پر سیٹ کر سکتے ہیں اور اس وقت تک نگرانی کر سکتے ہیں جب تک کہ واپس آنے سے پہلے کوئی پیغام نہ ہو۔
بلاشبہ، مرکزی دھاگے کے ساتھ بات چیت کرنے والے کنکرنٹ تھریڈز کے علاوہ۔ کنکرنٹ تھریڈز بھی ایک دوسرے سے براہ راست بات چیت کر سکتے ہیں۔
مندرجہ بالا مثال میں، استعمال کرتے ہوئےvar id = __threadId(),__threadId()فنکشن موجودہ تھریڈ کی ID حاصل کر سکتا ہے۔
تھریڈز کے درمیان مواصلت کے علاوہ، آپ تعامل کے لیے مشترکہ متغیرات بھی استعمال کر سکتے ہیں۔
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的值
}
مندرجہ بالا تمام افعال کا ایک سادہ مظاہرہ ہے۔