Type/to search
8
Follow
1364
Followers
정책 프로그램을 실제로 동시에 실행할 수 있게 하고 JavaScript 정책에 시스템 수준 멀티스레딩 지원을 추가합니다.
Discussions
Created 2023-03-02 14:19:15  Updated 2024-03-20 15:06:41
 3
 2394

img

정책 프로그램을 실제로 동시에 실행할 수 있게 하고 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的值 }

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

Comment
All comments (3)

    复制这个策略运行提示: 错误 ReferenceError: '__Thread' is not defined at main (FILE:5)

    3 years ago

    升级托管者

    3 years ago

    收藏学习

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)