Bei der Entwicklung von Strategien auf FMZ mit der JavaScript-Sprache ist die Strategie-Architektur abfragbar.exchange.Go
Funktionen, 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.threading
Ich 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.
Die folgenden Kurzbilder führen Sie zu einem individuellen Verständnis für jede Funktion.
__Thread
Eine Funktion kann einen Thread erstellen, der gleichzeitig eine Funktion ausführt. Zum Beispiel muss eine parallele Funktion erstellt werden.func1
,func1
Was 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))
})
}
Wir haben es in diesem Beispiel am Ende in der Main-Funktion verwendet.__threadJoin
Die Funktion wartet auf die Fertigstellung des parallel laufenden Strangs, die Variableret
Empfangen__threadJoin
Wir 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}
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.
Hauptsächlich für die Kommunikation zwischen Leitungen__threadPostMessage
Funktionen und__threadPeekMessage
Die 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)
}
}
__threadPostMessage
Funktionen 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.
__threadPeekMessage
Funktionen, 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.
Wir haben es in diesem Beispiel benutzt.var id = __threadId()
,__threadId()
Die Funktion kann die ID des aktuellen Threads abrufen.
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.
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