ایف ایم زیڈ پر جاوا اسکرپٹ زبان کا استعمال کرتے ہوئے حکمت عملی تیار کرتے وقت ، چونکہ حکمت عملی کی فن تعمیر کا جائزہ لیا جاتا ہے۔ اگر بیک وقت ڈیزائن کا منظرنامہ موجود ہے تو ،exchange.Go
فنکشن کا استعمال کچھ انٹرفیسز کو بیک وقت کال کرنے کے لئے کیا جاتا ہے ، تاکہ کچھ بیک وقت منظرناموں کی ضروریات کو پورا کیا جاسکے۔ لیکن اگر آپ ایک سلسلہ کارروائیوں کو انجام دینے کے لئے ایک ہی تھریڈ بنانا چاہتے ہیں تو ، یہ ناممکن ہے۔ مثال کے طور پر ، پائتھون زبان کی طرح ،threading
لائبریری کچھ بیک وقت ڈیزائن کرنے کے لئے.
اس ضرورت کی بنیاد پر ، ایف ایم زیڈ پلیٹ فارم نے سسٹم کی نچلی پرت کو اپ گریڈ کیا ہے۔ جاوا اسکرپٹ زبان میں حقیقی ملٹی تھریڈنگ سپورٹ بھی شامل کی گئی ہے۔ تفصیلی خصوصیات میں شامل ہیں:
اگلا، میں آپ کو ہر فنکشن کو ایک ایک کرکے سمجھنے کے لیے لے جاؤں گا۔
کے__Thread
function ایک تھریڈ تشکیل دے سکتا ہے اور بیک وقت ایک فنکشن انجام دے سکتا ہے۔ مثال کے طور پر، آپ کو ایک بیک وقت فنکشن تشکیل دینے کی ضرورت ہے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 کے طور پر بیان کی گئی ہے۔
یقیناً، اس کے علاوہ جو متوازی تھریڈز مین تھریڈ کے ساتھ بات چیت کرتے ہیں۔ متوازی تھریڈز بھی ایک دوسرے کے ساتھ براہ راست بات چیت کر سکتے ہیں۔
مندرجہ بالا مثال میں،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
}
مندرجہ بالا تمام افعال کا ایک سادہ مظاہرہ ہے۔ آئیے تھوڑی زیادہ پیچیدہ ٹیسٹ مثال پر نظر ڈالیں۔
اس ٹیسٹ کی حکمت عملی کا پتہ:https://www.fmz.com/strategy/401463
ایک نظر میں ، آپ کو معلوم نہیں ہوسکتا ہے کہ یہ ٹیسٹ کی حکمت عملی کیا کرتی ہے۔ اس سے کوئی فرق نہیں پڑتا ، آئیے اس کی وضاحت کریں۔ پہلے ، آئیے سیکھیں کہ WASM کیا ہے۔
Then the test strategy is to compare the execution efficiency of wasm and javascript, but when comparing, the two execution methods can be executed successively, and the time-consuming of each is counted. It is also possible to allow the two execution methods to execute concurrently, and the statistics are time-consuming. Now that the underlying concurrency implementation of the JavaScript language strategy has been supported, the test strategy uses a concurrent method to compare naturally and compare the execution speed of the same algorithm.
- Algorithm of C language version, fib function
// سی زبان میں فبونیکی نمبروں کا تکرار الگورتھم int فب ((int ف) { اگر (f < 2) f لوٹاتا ہے؛ واپسی fib ((f - 1) + fib ((f - 2) ؛ }
- JavaScript language version of the algorithm, fib function
// ایک ہی فبونیکی نمبروں کے لئے ایک recursive الگورتھم، جاوا سکرپٹ میں لکھا فنکشن fib ((f) { اگر (f < 2) واپس f واپسی fib ((f - 1) + fib ((f - 2) }
It can be seen that the logic of the two fib function algorithms is exactly the same. The following is the source code of the test strategy:
فنکشن main() {
// کوڈ کو دیکھنے کے لئے آسان بنانے کے لئے، میں نے مندرجہ ذیل کوڈ پر براہ راست تبصرہ لکھتے ہیں:
چلو سائیکل = 100 // ٹیسٹ لوپ 100 بار چلاتا ہے
ان پٹ کی اجازت دیں = 30 // پیرامیٹرز کہ الگورتھم fib تقریب کو منتقل کیا جائے گا
تھریڈز = [
__ تھریڈ ((فنکشن ((سائیکل، ان پٹ) { // fib فنکشن کے جاوا اسکرپٹ ورژن کا استعمال کرتے ہوئے حساب کتاب انجام دینے کے لئے ایک تھریڈ بیک وقت تخلیق کیا جاتا ہے
تقریب fib(f) { // ٹیسٹنگ کے لئے استعمال کیا مخصوص الگورتھم، fib تقریب
اگر (f < 2) واپس f
واپسی fib ((f - 1) + fib ((f - 2)
}
ریٹ = 0
کے لئے (i = 0؛ i < سائیکل؛ i++) { // 100 بار کے لئے لوپ
ret = fib(input) ؛ // جاوا اسکرپٹ زبان کے fib فنکشن کو کال کریں
لاگ ((
__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
})
}
Simply put, WASM is a program code with higher execution efficiency. In the example, we convert the c language code of "Fibonacci number recursive algorithm" into WASM. The process is like this:
1. Compile a piece of C language function code into wasm code.
We can use the website to convert: https://wasdk.github.io/WasmFiddle/
// سی زبان میں فبونیکی نمبروں کا تکرار الگورتھم int فب ((int ف) { اگر (f < 2) f لوٹاتا ہے؛ واپسی fib ((f - 1) + fib ((f - 2) ؛ }
2. Further encode the wasm code into a hex string.
The following commands can be used:
python -c
The encoded hex string is ```let data = 'data:hex,0061736d0100000001868...``` in the code.
3. Then parse it into a wasm model through the function ```wasm.parseModule()``` integrated by FMZ.
4. Create a wasm model instance through the function ```wasm.buildInstance()``` integrated by FMZ.
5. Then call the ```fib``` function in this wasm model instance, namely: ```ret = instance.callFunction('fib', input)```.
## Create a real bot to run the test
This test strategy can only be used for real bot testing. JavaScript multi-threading functions do not support backtesting so far.
```wasm``` and ```JavaScript``` execution comparison, the final execution results:
2023-03-06 11:00:33 انفارمیشن #2 wasm fib: 832040 گزر گیا: 13283.773019
2023-03-06 11:00:33 انفارمیشن #1 جاوا اسکرپٹ فیب: 832040 گزر گیا: 21266.326974
It seems that
wasm