
Khi phát triển các chiến lược trên FMZ bằng ngôn ngữ JavaScript, kiến trúc chiến lược sẽ là thăm dò. Nếu có một kịch bản thiết kế đồng thời, thì đó làexchange.GoCác hàm được sử dụng để thực hiện các cuộc gọi đồng thời đến một số giao diện, do đó đáp ứng nhu cầu của một số tình huống đồng thời. Tuy nhiên, nếu bạn muốn tạo một luồng riêng biệt để thực hiện một loạt các hoạt động, điều đó là không thể. Ví dụ, giống như trong Python, hãy sử dụngthreadingThư viện được sử dụng để thực hiện một số thiết kế đồng thời.
Dựa trên nhu cầu này, nền tảng FMZ đã nâng cấp hệ thống cơ bản. Hỗ trợ đa luồng thực sự cũng đã được thêm vào ngôn ngữ JavaScript. Các tính năng chi tiết bao gồm:
Tiếp theo, trình soạn thảo sẽ hướng dẫn bạn hiểu từng chức năng một.
__ThreadMột hàm có thể tạo một luồng để thực thi một hàm khác đồng thời. Ví dụ, bạn cần tạo một hàm đồng thờifunc1,func1Chức năng này có tác dụng gì? Chúng ta có thể để nó tích lũy từ 0 đến 9. Để xem quá trình tích lũy dần dần này, hãy sử dụng vòng lặp for trong hàm func1 để tạm dừng mỗi lần (hàm Sleep được sử dụng để ngủ trong một số mili giây nhất định) trong một khoảng thời gian nhất định của thời gian.
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)
}
Trong các tình huống ứng dụng thực tế, chúng ta có thể thực hiện các yêu cầu http đồng thời như thế này:
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))
})
}
Trong ví dụ trên, cuối cùng chúng ta đã sử dụng nó trong hàm chính__threadJoinChức năng chờ các luồng đồng thời hoàn tất thực thi, biếnrettiếp quản__threadJoinGiá trị trả về của hàm. Chúng ta in giá trị trả về này và quan sát kết quả cụ thể của việc thực thi luồng đồng thời này.
// 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
}
Quay lại ví dụ trước, sau khi tạo luồng, bạn có thể buộc thực thi luồng kết thúc sau khi chờ 1 giây.
Giao tiếp giữa các luồng chủ yếu được sử dụng__threadPostMessageChức năng và__threadPeekMessagechức năng. Chúng ta hãy xem ví dụ đơn giản sau:
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)
}
}
__threadPostMessageHàm này được sử dụng để gửi tin nhắn đến một luồng. Tham số đầu tiên là ID của luồng cụ thể mà tin nhắn được gửi đến và tham số thứ hai là tin nhắn sẽ được gửi, có thể là một chuỗi, một số, một mảng, đối tượng JSON, v.v. Bạn có thể gửi tin nhắn đến luồng chính trong hàm luồng đồng thời. ID của luồng chính được định nghĩa là 0.
__threadPeekMessageChức năng này được sử dụng để theo dõi tin nhắn được gửi bởi một luồng. Bạn có thể đặt thời gian chờ (tính bằng mili giây) hoặc đặt thành 0 để chặn luồng và theo dõi cho đến khi có tin nhắn trước khi trả về.
Tất nhiên, ngoại trừ các luồng đồng thời giao tiếp với luồng chính. Các luồng đồng thời cũng có thể giao tiếp trực tiếp với nhau.
Trong ví dụ trên, sử dụngvar id = __threadId(),__threadId()Hàm này có thể lấy được ID của luồng hiện tại.
Ngoài việc giao tiếp giữa các luồng, bạn cũng có thể sử dụng các biến chia sẻ để tương tác.
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的值
}
Trên đây là bản trình bày đơn giản về tất cả các chức năng.