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

저자:발명가들의 수량화 - 작은 꿈, 제작: 2023-03-02 14:19:15, 업데이트: 2024-03-20 15:06:41

让策略程序真正并发执行,给JavaScript策略增加系统底层多线程支持

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

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

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

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

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

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


함수1 (잠 밀리 초) { var sum = 0 (var i = 0 ; i < 10 ; i++) { 합 += i 수면 (수면 밀리 초) 로그 (sum:, sum) }

return sum

}

function main (() { //__Thread 함수를 사용하여 func1 함수의 함수인 200를 가진 동시다발적으로 하나의 스레드를 생성합니다. // func1 함수가 여러 개의 함수를 가지고 있는 경우 var thread1Id = __Thread ((func1, 200)

// 这里需要等待线程Id为thread1Id的线程执行结果,否则main函数执行完就直接释放所有线程
var ret = __threadJoin(thread1Id)
Log("ret:", ret)

}


实际应用场景中,我们可以这样并发进行http请求:

함수 main() { 가닥을 눌러라 = [ https://www.baidu.com”, “https://www.163.com”].map (함수) (URL) { 반환스레드 (thread)) 로그 (GET, url) 반환 HttpQuery (URL) }, url) }) threads.forEach (각) function (각) 로그threadJoin (제동) }) }


### 等待线程执行结束回收资源并返回执行结果

以上例子中我们在main函数中最后使用了```__threadJoin```函数来等待并发的线程执行完毕,变量```ret```接收```__threadJoin```函数的返回值,我们打印了这个返回值,可以观察这个并发的线程执行的具体结果。

// id: 스레드 ID,terminated: 강제 중지 여부,elapsed: 시간이 소요되는 ((나초),ret: 스레드 실행 함수의 반환 값 ret: {id:1,terminated:false,elapsed:2004884301,ret:45}


### 强制结束线程,并回收资源

함수1 (잠 밀리 초) { var sum = 0 (var i = 0 ; i < 10 ; i++) { 합 += i 수면 (수면 밀리 초) 로그 (sum:, sum) }

return sum

}

함수 main() { var thread1Id = __Thread ((func1, 200) 잠자리 (1000) retThreadTerminate = __threadTerminate (thread1Id) 로그 ((retThreadTerminate) // true }


还是以刚才的例子,在创建线程后,可以在等待1秒之后就强制终止线程执行。

### 线程间通信

线程间通信主要使用```__threadPostMessage```函数和```__threadPeekMessage```函数。我们来看以下简单例子:

function1 ((() { var id = __threadId ((() while (true) { var postMsg = 은 id: + id + 의 스레드 함수 func1의 메시지 에서 나옵니다 __threadPostMessage(0, postMsg) // 메인 스레드에 메시지를 전송합니다 var peekMsg = __threadPeekMessage() // 다른 스레드로부터 메시지를 수신합니다. 로그 (peekMsg) 수면 ((5000) ♪ ♪ ♪ ♪

함수 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的值

} “`

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


관련 내용

더 많은 내용

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

뼈 칼수집하고 배우는 것

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