資源の読み込みに... 荷物...

ポリシーの実行を実際に同時に行うようにし,JavaScriptのポリシーのシステム底層に多スレッドサポートを追加します.

作者: リン・ハーン発明者 量化 - 微かな夢作成日:2023-03-02 14:19:15 更新日:2024-03-20 15:06:41 更新日:2020-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20 更新日:2021-03-20

img

ポリシーの実行を実際に同時に行うようにし,JavaScriptのポリシーのシステム底層に多スレッドサポートを追加します.

JavaScript言語を使用してFMZでポリシーを開発する際には,ポリシー構造が相談される.並行設計のシナリオがある場合,exchange.Goインタフェースを同時に呼び出すため,複数のシナリオの必要性を実現する.しかし,実際に単一のスレッドを作成したい場合,Python言語のように一連の操作を実行するには,実行できません.threadingデザインを重ねるために.

FMZプラットフォームは,この需要に基づいてシステム基盤をアップグレードした.JavaScript言語に真のマルチスレッドサポートも追加した.詳細機能には以下が含まれます.

  • 設定された関数を同時に実行するスレッドを作成します.
  • ワイヤレス通信.
  • 共有されたスレッド間の保存される変数.
  • 実行が完了して実行結果が返ってくるのを待つ.
  • 強制的にスレッドを終了し,資源をリサイクルする.
  • 同期スレッド実行関数で現在のスレッドIDを取得します.

このビデオでは,各機能について少しずつ説明します.

スレッドを同時に作成し,カスタマイズされた関数を実行します

__Thread函数には,一本のスレッドを作成し,同時に関数を実行することができる.例えば,並行関数を作成する必要がある.func1func1Function は何をするのか? 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オブジェクトなどである.並行スレッド関数では,メインスレッドにメッセージを送信することができ,メインスレッドの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的值
}

機能の概要は以下の通りです.


関連性

もっと

骨ナイフこのポリシーを複製する 実行ヒント: Error ReferenceError: '__Thread' is not defined at main (__FILE__:5)

骨ナイフコレクション 学習

発明者の量化アップグレード管理者