
Saat mengembangkan strategi di FMZ menggunakan bahasa JavaScript, arsitektur strateginya adalah polling. Jika ada skenario desain bersamaan, itu adalahexchange.GoFungsi digunakan untuk membuat panggilan serentak ke beberapa antarmuka, sehingga memenuhi kebutuhan beberapa skenario serentak. Namun, jika Anda ingin membuat thread terpisah untuk melakukan serangkaian operasi, hal itu tidak memungkinkan. Misalnya, seperti di Python, gunakanthreadingPustaka ini digunakan untuk melakukan beberapa desain serentak.
Berdasarkan permintaan ini, platform FMZ meningkatkan sistem yang mendasarinya. Dukungan multi-threading yang sesungguhnya juga telah ditambahkan ke bahasa JavaScript. Fitur-fitur terperinci meliputi:
Berikutnya, editor akan mengajak Anda memahami setiap fungsi satu per satu.
__ThreadSuatu fungsi dapat membuat thread untuk mengeksekusi suatu fungsi secara serentak. Misalnya, Anda perlu membuat fungsi bersamaanfunc1,func1Apa fungsi tersebut? Kita bisa membiarkannya terakumulasi dari 0 hingga 9. Untuk melihat proses akumulasi bertahap ini, gunakan for loop dalam fungsi func1 untuk menjeda setiap waktu (fungsi Sleep digunakan untuk tidur selama sejumlah milidetik tertentu) untuk jangka waktu tertentu. waktu.
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 skenario aplikasi sebenarnya, kita dapat 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))
})
}
Pada contoh di atas, kami akhirnya menggunakannya dalam fungsi utama__threadJoinFungsi untuk menunggu thread bersamaan untuk menyelesaikan eksekusi, variabelretmengambil alih__threadJoinNilai balik dari fungsi. Kami mencetak nilai balik ini dan mengamati hasil spesifik dari eksekusi thread bersamaan 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 lagi, setelah membuat utas, Anda dapat memaksa eksekusi utas untuk berakhir setelah menunggu selama 1 detik.
Komunikasi antar-utas terutama digunakan__threadPostMessageFungsi dan__threadPeekMessagefungsi. Mari kita lihat contoh sederhana berikut ini:
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 mengirim pesan ke thread. Parameter pertama adalah ID thread tertentu yang menjadi tujuan pengiriman pesan, dan parameter kedua adalah pesan yang akan dikirim, yang dapat berupa string, angka, array, objek JSON, dll. Anda dapat mengirim pesan ke thread utama dalam fungsi thread bersamaan. ID thread utama ditetapkan sebagai 0.
__threadPeekMessageFungsi ini digunakan untuk memantau pesan yang dikirim oleh thread. Anda dapat mengatur batas waktu (dalam milidetik) atau mengaturnya ke 0 untuk memblokir thread dan memantau hingga ada pesan sebelum kembali.
Tentu saja, kecuali untuk thread bersamaan yang berkomunikasi dengan thread utama. Utas yang bersamaan juga dapat berkomunikasi langsung satu sama lain.
Dalam contoh di atas, menggunakanvar id = __threadId(),__threadId()Fungsi ini dapat memperoleh ID thread saat ini.
Selain komunikasi antar-utas, Anda juga dapat menggunakan variabel bersama 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 sederhana dari semua fungsi.