avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

정책 프로그램을 실제로 동시에 실행할 수 있게 하고 JavaScript 정책에 시스템 수준 멀티스레딩 지원을 추가합니다.

만든 날짜: 2023-03-02 14:19:15, 업데이트 날짜: 2024-03-20 15:06:41
comments   3
hits   2081

정책 프로그램을 실제로 동시에 실행할 수 있게 하고 JavaScript 정책에 시스템 수준 멀티스레딩 지원을 추가합니다.

정책 프로그램을 실제로 동시에 실행할 수 있게 하고 JavaScript 정책에 시스템 수준 멀티스레딩 지원을 추가합니다.

JavaScript 언어를 사용하여 FMZ에서 전략을 개발할 때, 전략 아키텍처는 폴링입니다. 동시 설계 시나리오가 있는 경우exchange.Go함수는 일부 인터페이스에 대한 동시 호출을 만드는 데 사용되며, 이를 통해 일부 동시 시나리오의 요구를 충족시킬 수 있습니다. 그러나 일련의 작업을 수행하기 위해 별도의 스레드를 만들고 싶은 경우 불가능합니다. 예를 들어 Python에서와 같이 다음을 사용합니다.threading라이브러리는 일부 동시적 설계를 하는 데 사용됩니다.

이러한 요구에 따라 FMZ 플랫폼은 기본 시스템을 업그레이드했습니다. JavaScript 언어에 진정한 멀티스레딩 지원도 추가되었습니다. 자세한 기능은 다음과 같습니다.

  • 사용자 정의 함수를 동시에 실행하기 위해 스레드를 생성합니다.
  • 스레드 간 통신.
  • 스레드 간에 저장된 변수를 공유합니다.
  • 스레드가 실행을 완료하고 리소스를 회수하여 실행 결과를 반환할 때까지 기다립니다.
  • 스레드를 강제로 종료하고 리소스를 회수합니다.
  • 동시 스레드 실행 함수에서 현재 스레드 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초 동안 기다린 후 스레드 실행을 강제로 종료할 수 있습니다.

스레드 간 통신

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으로 설정하여 스레드를 차단하고 메시지가 있을 때까지 모니터링한 후 반환할 수 있습니다.

물론, 메인 스레드와 통신하는 동시 스레드는 제외합니다. 동시 스레드는 서로 직접 통신할 수도 있습니다.

동시 스레드 실행 함수에서 현재 스레드 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的值
}

위의 내용은 모든 기능에 대한 간단한 설명입니다.