Das Programm kann parallel ausgeführt werden und unterstützt mehrere Themen an der Unterseite von JavaScript-Policies.

Schriftsteller:Kleine Träume, Erstellt: 2023-03-02 14:19:15, Aktualisiert: 2024-03-20 15:06:41

img

Das Programm kann parallel ausgeführt werden und unterstützt mehrere Themen an der Unterseite von JavaScript-Policies.

Bei der Entwicklung von Strategien auf FMZ mit der JavaScript-Sprache ist die Strategie-Architektur abfragbar.exchange.GoFunktionen, die gleichzeitig einige Interfaces aufrufen, um die Anforderungen für einige gleichzeitige Szenarien zu erfüllen. Aber es ist nicht möglich, eine Reihe von Operationen auszuführen, wenn man wirklich einen Thread einzeln erstellen möchte, wie zum Beispiel in der Python-Sprache.threadingIch habe mich mit dem Projekt beschäftigt und ich habe mir vorgestellt, dass ich das Projekt in einer Reihe von Projekten durchführen werde.

Aufgrund dieser Bedürfnisse wurde die FMZ-Plattform aufgerüstet. Es wurde auch echte Mehrthread-Unterstützung für JavaScript hinzugefügt.

  • Erstellen Sie Threads, um gleichzeitig benutzerdefinierte Funktionen auszuführen.
  • Wird es nicht möglich, das zu tun?
  • Variablen, die zwischen den geteilten Threads gespeichert werden.
  • Warten Sie, bis die Ausführung des Themes die Rückgewinnungsressourcen beendet und die Ausführungsergebnisse zurückgegeben hat.
  • Sie müssen ihre Fäden zwangsweise beenden und Ressourcen zurückgewinnen.
  • Erhält die aktuelle Thread-ID in einer parallel laufenden Thread-Exekutionsfunktion.

Die folgenden Kurzbilder führen Sie zu einem individuellen Verständnis für jede Funktion.

Erstellen Sie Threads, um gleichzeitig benutzerdefinierte Funktionen auszuführen

__ThreadEine Funktion kann einen Thread erstellen, der gleichzeitig eine Funktion ausführt. Zum Beispiel muss eine parallele Funktion erstellt werden.func1func1Was macht die Funktion? Wir können sie von 0 auf 9 addieren lassen. Um diesen schrittweisen Additionsprozess zu sehen, pausieren wir in der Funktion func1 mit der Funktion for-Zyklen (die für die Funktion Sleep verwendet wird, um eine bestimmte Anzahl von Millisekunden in Ruhe zu halten) eine bestimmte Zeit.

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)
}

In einer praktischen Anwendungsszenario können wir eine HTTP-Anfrage gleichzeitig wie folgt ausführen:

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))
    })
}

Warten auf die Ausführung des Themes, um die Rückgewinnungsressourcen zu beenden und die Ausführungsergebnisse zurückzugeben

Wir haben es in diesem Beispiel am Ende in der Main-Funktion verwendet.__threadJoinDie Funktion wartet auf die Fertigstellung des parallel laufenden Strangs, die VariableretEmpfangen__threadJoinWir drucken den Wert der Funktion, die wir zurückgeben, um die konkreten Ergebnisse der Ausführung dieses parallel verlaufenden Strangs zu beobachten.

// id:线程ID,terminated:是否被强制停止,elapsed:耗时(纳秒),ret:线程执行函数的返回值
ret: {"id":1,"terminated":false,"elapsed":2004884301,"ret":45}

Zwangsläufe und Rückgewinnung von Ressourcen

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
}

Oder wie in dem Beispiel, in dem ein Thread nach dem Erstellen erzwungen werden kann, dass er nach einer Wartezeit von 1 Sekunde beendet wird.

Kommunikation zwischen Leitungen

Hauptsächlich für die Kommunikation zwischen Leitungen__threadPostMessageFunktionen und__threadPeekMessageDie Funktion ist ein einfaches Beispiel:

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)
    }
}

__threadPostMessageFunktionen werden verwendet, um Nachrichten an einen Thread zu senden. Der erste Parameter ist die ID des Threads, an den er gesendet wird. Der zweite Parameter ist die gesendete Nachricht, die String, Zahlenwert, Array, JSON-Objekt usw. sein kann.

__threadPeekMessageFunktionen, die für das Abhören von Nachrichten verwendet werden, die von einem Thread gesendet werden, können eine Überstundenzeit ("Millisekundenzahl") festlegen, oder sie können auf 0 gesetzt werden, um zu blockieren, und werden abgehört, bis eine Nachricht zurückgekehrt ist.

Natürlich kann man neben der Kommunikation zwischen Parallelthemen und Hauptthemen auch direkt zwischen Parallelthemen kommunizieren.

Erhalten Sie die aktuelle Thread-ID in einer parallel laufenden Thread-Exekutionsfunktion

Wir haben es in diesem Beispiel benutzt.var id = __threadId()__threadId()Die Funktion kann die ID des aktuellen Threads abrufen.

Variablen, die zwischen Threads geteilt werden

Zusätzlich zur Kommunikation zwischen Threads kann man mit Shared Variablen interagieren.

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的值
}

Das ist eine einfache Darstellung aller Funktionen.


Verwandt

Mehr

Das KnochenmesserKopie dieser Strategie Ausführen Tipp: Fehler ReferenceError: '__Thread' ist nicht definiert bei main (__FILE__:5)

Das KnochenmesserSammeln und Lernen

Der Erfinder quantifiziertUpgrade der Treuhänder