
Apabila membangunkan strategi pada FMZ menggunakan bahasa JavaScript, seni bina strategi ialah tinjauan pendapat. Sekiranya terdapat senario reka bentuk serentak, ia adalahexchange.GoFungsi digunakan untuk membuat panggilan serentak ke beberapa antara muka, dengan itu memenuhi keperluan beberapa senario serentak. Walau bagaimanapun, jika anda ingin mencipta benang yang berasingan untuk melaksanakan satu siri operasi, ia tidak boleh digunakan, contohnya, seperti dalam PythonthreadingPerpustakaan digunakan untuk melakukan beberapa reka bentuk serentak.
Berdasarkan permintaan ini, platform FMZ menaik taraf sistem asas. Sokongan berbilang benang sebenar juga telah ditambahkan pada bahasa JavaScript. Ciri terperinci termasuk:
Seterusnya, editor akan membawa anda memahami setiap fungsi satu persatu.
__ThreadFungsi boleh mencipta benang untuk melaksanakan fungsi secara serentak. Sebagai contoh, anda perlu mencipta fungsi serentakfunc1,func1Apakah fungsinya? Kita boleh biarkan ia terkumpul dari 0 hingga 9. Untuk melihat proses pengumpulan beransur-ansur ini, gunakan gelung for dalam fungsi func1 untuk menjeda setiap kali (fungsi Tidur digunakan untuk tidur untuk bilangan milisaat tertentu) untuk tempoh tertentu masa.
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)
}
Dalam senario aplikasi sebenar, kami boleh membuat permintaan http serentak seperti ini:
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))
})
}
Dalam contoh di atas, kami akhirnya menggunakannya dalam fungsi utama__threadJoinBerfungsi untuk menunggu urutan serentak untuk menyelesaikan pelaksanaan, berubah-ubahretmengambil alih__threadJoinNilai pulangan fungsi Kami mencetak nilai pulangan ini dan memerhati keputusan khusus pelaksanaan utas serentak ini.
// 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
}
Mengambil contoh sebelumnya sekali lagi, selepas mencipta benang, anda boleh memaksa pelaksanaan benang ditamatkan selepas menunggu selama 1 saat.
Komunikasi antara benang digunakan terutamanya__threadPostMessageFungsi dan__threadPeekMessagefungsi. Mari kita lihat contoh mudah berikut:
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)
}
}
__threadPostMessageFungsi ini digunakan untuk menghantar mesej ke utas Parameter pertama ialah ID utas tertentu yang mesej dihantar, dan parameter kedua ialah mesej yang akan dihantar, yang boleh menjadi rentetan, nombor, dan. tatasusunan, objek JSON, dsb. Anda boleh menghantar mesej ke utas utama dalam fungsi utas serentak ID utas utama ditakrifkan sebagai 0.
__threadPeekMessageFungsi ini digunakan untuk memantau mesej yang dihantar oleh utas Anda boleh menetapkan tamat masa (dalam milisaat) atau menetapkannya kepada 0 untuk menyekat utas dan memantau sehingga ada mesej sebelum kembali.
Sudah tentu, kecuali untuk utas serentak yang berkomunikasi dengan utas utama. Benang serentak juga boleh berkomunikasi secara langsung antara satu sama lain.
Dalam contoh di atas, menggunakanvar id = __threadId(),__threadId()Fungsi ini boleh mendapatkan ID benang semasa.
Selain komunikasi antara benang, anda juga boleh menggunakan pembolehubah yang dikongsi untuk interaksi.
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的值
}
Di atas adalah demonstrasi mudah semua fungsi.