
JavaScript 언어를 사용하여 FMZ에서 전략을 개발할 때, 전략 아키텍처는 폴링입니다. 동시 설계 시나리오가 있는 경우exchange.Go함수는 일부 인터페이스에 대한 동시 호출을 만드는 데 사용되며, 이를 통해 일부 동시 시나리오의 요구를 충족시킬 수 있습니다. 그러나 일련의 작업을 수행하기 위해 별도의 스레드를 만들고 싶은 경우 불가능합니다. 예를 들어 Python에서와 같이 다음을 사용합니다.threading라이브러리는 일부 동시적 설계를 하는 데 사용됩니다.
이러한 요구에 따라 FMZ 플랫폼은 기본 시스템을 업그레이드했습니다. JavaScript 언어에 진정한 멀티스레딩 지원도 추가되었습니다. 자세한 기능은 다음과 같습니다.
다음으로, 편집기는 각 기능을 하나씩 이해하도록 안내할 것입니다.
__Thread함수는 함수를 동시에 실행하기 위해 스레드를 생성할 수 있습니다. 예를 들어, 동시 함수를 만들어야 합니다.func1,func1이 기능은 어떤 역할을 하나요? 0에서 9까지 누적되도록 할 수 있습니다. 이 점진적인 누적 프로세스를 보려면 func1 함수에서 for 루프를 사용하여 특정 기간 동안 매번 일시 중지합니다(Sleep 함수는 특정 밀리초 수 동안 휴면 상태로 유지하는 데 사용됩니다). 시간의.
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초 동안 기다린 후 스레드 실행을 강제로 종료할 수 있습니다.
Interthread 통신은 주로 사용됩니다__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이 함수는 스레드에 메시지를 보내는 데 사용됩니다. 첫 번째 매개변수는 메시지가 전송되는 특정 스레드의 ID이고 두 번째 매개변수는 전송할 메시지로, 문자열, 숫자, 배열, 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的值
}
위의 내용은 모든 기능에 대한 간단한 설명입니다.