정책 프로그램이 실제로 동시에 실행되도록 하므로, 시스템 하층에서 JavaScript 정책에 멀티 스레드 지원을 추가합니다.

저자:작은 꿈, 제작: 2023-03-02 14:19:15, 업데이트: 2024-03-20 15:06:41

img

정책 프로그램이 실제로 동시에 실행되도록 하므로, 시스템 하층에서 JavaScript 정책에 멀티 스레드 지원을 추가합니다.

자바스크립트 언어를 사용하여 FMZ에서 정책을 개발할 때, 정책 구조가 하기 때문에.exchange.Go함수는 몇 개의 인터페이스의 동시 호출을 수행하여 몇 가지 동시 시나리오의 요구를 달성합니다. 그러나 실제로 하나의 스레드를 개별적으로 만들고서 일련의 작업을 수행하려는 경우, 예를 들어 파이썬 언어와 같이,threading큐가 동시다발적인 디자인을 하고 있다.

이러한 요구에 따라 FMZ 플랫폼은 시스템 기반을 업그레이드했다. 또한 자바스크립트 언어에 진정한 멀티 스레드 지원을 추가했다. 자세한 기능은 다음과 같습니다.

  • 동시다발적으로 사용자 정의 함수를 실행하는 스레드를 생성합니다.
  • 힌트 간 통신.
  • 공유된 스레드 간 저장된 변수.
  • 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은.
  • 동행된 스레드 실행 함수에서 현재 스레드 ID를 얻는다.

다음 글은 각 기능에 대한 이해를 함께합니다.

스레드를 동시에 생성하여 사용자 정의 함수를 실행합니다

__Thread함수는 하나의 스레드를 생성하고 동시에 하나의 함수를 실행할 수 있다. 예를 들어, 동시에 하나의 함수를 생성해야 한다.func1func1함수가 무엇을 하는 걸까요? 우리는 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초 기다린 후에 스레드를 강제 종료할 수 있다.

유선 간 통신

유선 간 통신의 주요 사용__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 객체 등이 될 수 있습니다.

__threadPeekMessage함수는 어떤 스레드에서 전송되는 메시지를 감청하기 위해 사용되며, 시간 초과 (毫秒) 를 설정할 수 있으며, 0으로 차단을 설정할 수도 있으며, 메시지가 돌아올 때까지 계속 감청할 수 있습니다.

물론, 동행 스레드와 메인 스레드 통신 이외에도, 동행 스레드 사이에서도 직접 상호 통신이 가능합니다.

동행된 스레드 실행 함수에서 현재 스레드 ID를 가져옵니다.

이 예제에서,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的值
}

이것은 모든 기능에 대한 간단한 설명입니다.


관련

더 많은

뼈 칼이 정책을 복사 실행 팁: 오류 ReferenceError: '__Thread' is not defined at main (__FILE__:5)

뼈 칼수집하고 배우는 것

발명가 양자화업그레이드 관리자