Die FMZ Quant Trading Plattform unterstützt wirklich die Mehrthread-Funktion derJavaScript
Das System setzt eine Sprachstrategie von Grund auf ein und verfolgt folgende Ziele:
Gegenstände | Anweisungen | Anmerkungen |
---|---|---|
Schleiffaden | Mehrthreadedes globales Objekt | Funktionen der Mitglieder:Thread , getThread , mainThread , usw. |
Faden | Thread-Objekt | Funktionen der Mitglieder:peekMessage , postMessage , join , usw. |
ThreadLock | Thread-Sperrobjekt | Funktionen der Mitglieder:acquire , release . Sie können als Parameter der Thread-Ausführungsfunktion in die Thread-Umgebung übergeben werden. |
ThreadEvent | Ereignisobjekt | Funktionen der Mitglieder:set , clear , wait , isSet . Sie können als Parameter der Thread-Ausführungsfunktion in die Thread-Umgebung übergeben werden. |
ThreadBedingung | Objekt der Bedingung | Funktionen der Mitglieder:notify , notifyAll , wait , acquire , release . Sie können als Parameter der Thread-Ausführungsfunktion in die Thread-Umgebung übergeben werden. |
ThreadDict | Wörterbuchobjekt | Funktionen der Mitglieder:get , set . Sie können als Parameter der Thread-Ausführungsfunktion in die Thread-Umgebung übergeben werden. |
Diethreading
Object ist ein globales Multithreading-Management-Tool, das Funktionen wie das Erstellen von gleichzeitigen Threads, Thread-Locks und Condition-Objekten bietet.threading
Objekt. Dieses Objekt wird nur von derJavaScript
Sprachstrategie.
DieThread()
Funktion wird verwendet, um gleichzeitige Threads zu erstellen.
DieThread()
Funktion gibt a zurückThread
Objekt, mit dem gleichzeitige Threads verwaltet werden, Threads kommunizieren usw.
Thread
Gegenstand
Thread ((func,...args) Der Begriff "Thread" (Artikel)
Der Parameterfunc
ist eine Funktion zur gleichzeitigen Ausführung (übergeben durch Referenz) und unterstützt die Übergabe anonymer Funktionen.func
kann mehrere Parameter akzeptieren, die durch...args
Daher wird die Parameterliste vonfunc
die in der Richtlinie...args
.
Funktion
wahr
Funktion
Der Parameterarg
ist der tatsächliche Parameter, der anfunc
(d. h. die Funktion zur gleichzeitigen Ausführung von Threads), wenn der Rückruf ausgeführt wird; es kann mehrere Parameter gebenarg
, und die Parameterliste derfunc
die in der Richtlinie...args
.
Arg
falsche
String, Zahl, bool, Objekt, Array, Funktion, Nullwert und andere vom System unterstützte Typen
Der Parameteritem
ist ein Array, das die gleichzeitig auszuführenden Funktionsreferenzen und deren Parameter enthält.item
Parameter können bei Aufruf derThread
function.
Artikel wahr Reihenfolge
function test1(a, b, c) {
Log("test1:", a, b, c)
}
function main() {
var t1 = threading.Thread(test1, 1, 2, 3)
var t2 = threading.Thread(function (msg) {
Log("msg:", msg)
}, "Hello thread2")
t1.join()
t2.join()
}
Erstellen Sie gleichzeitige Threads für eine benutzerdefinierte Funktion und eine anonyme Funktion.
function test1(msg) {
Log("msg:", msg)
test2("Hello test2")
}
function main() {
var t1 = threading.Thread(
[function(a, b, c) {Log(a, b, c)}, 1, 2, 3],
[test1, "Hello test1"],
[`function test2(msg) {Log("msg:", msg)}`])
t1.join()
}
VerwendenThread(...items)
Form, um gleichzeitige Threads zu erstellen und mehrere Funktionen sequenziell auszuführen.
function testFunc1(p) {
Log("testFunc1 p:", p)
}
function main() {
threading.Thread(function(pfn) {
var threadName = threading.currentThread().name()
var threadId = threading.currentThread().id()
pfn(`in thread threadName: ${threadName}, threadId: ${threadId}`)
}, testFunc1).join()
}
Es unterstützt das Übergeben von Parametern an gleichzeitig ausgeführte Funktionen.
function ml(input) {
const net = new brain.NeuralNetwork()
net.train([
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] },
])
return net.run(input)
}
function main() {
var ret = threading.Thread([ml, [1, 0]], [HttpQuery("https://unpkg.com/brain.js")]).join()
// ret: {"id":1,"terminated":false,"elapsed":337636000,"ret":{"0":0.9339330196380615}}
Log(ret)
}
Es unterstützt die Übergabe von Funktionsfolgen und kann dynamisch externe Bibliotheken für gleichzeitiges Rechnen importieren.
Die Fädenfunktionfunc
in dieThread()
Die Funktion für die gleichzeitige Ausführung läuft in einer isolierten Umgebung, so dass Variablen außerhalb des Threads nicht direkt referenziert werden können, und die Kompilierung wird beim Referenzieren fehlschlagen. Gleichzeitig werden Referenzen zu anderen Closure-Funktionen nicht innerhalb des Threads unterstützt. Alle von der Plattform bereitgestellten APIs können innerhalb des Threads aufgerufen werden, aber andere benutzerdefinierte Funktionen können nicht aufgerufen werden.
Es unterstützt Backtesting-System und Live-Trading-Umgebung. Alle gleichzeitigen Thread-bezogenen Funktionen werden nur als Code-Kompatibilität im Backtesting-System unterstützt und werden nicht tatsächlich von gleichzeitigen Threads ausgeführt, so dass sie in diesem Kapitel nicht wiederholt werden.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/threads/threading/condition Condition}, {@fun/threads/threading/event Event}, {@fun/threads/threading/Dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop event}
DiegetThread()
Die Funktion wird verwendet, um das Thread-Objekt basierend auf der angegebenen Thread-ID zu erhalten.
DiegetThread()
Funktion gibt dieThread
Objekt mit der durch den Parameter angegebenen ThreadId
Thread
Gegenstand
getThread (ThreadId)
Der ParameterthreadId
ist die Thread-Objekt-ID. Erhalten Sie das entsprechende Thread-Objekt, indem Sie den Parameter angeben.
Schleifen wahr Zahl
function main() {
var t1 = threading.Thread(function () {
Log("Hello thread1")
})
// The Thread object has a method: id(), which is used to get the thread ID. You can view the section of the document corresponding to the Thread object.
var threadId = t1.id()
var threadName = t1.name()
Log("threadId:", threadId, ", threadName:", threadName)
var t2 = threading.getThread(threadId)
Log(`threadId == t2.id():`, threadId == t2.id(), `, threadName == t2.name():`, threadName == t2.name())
}
Das angegebene Thread-Objekt durchlaufenthreadId
.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
Wenn der Thread, den Sie erhalten möchten, ausgeführt und freigegeben wurde, können Sie nicht verwendenthreading.getThread(threadId)
um das Gewindeobjekt des Gewindes zu erhalten.
{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/condition Condition}, {@fun/threads/threading/event Event}, {@fun/threads/threads/event Loop}, {@fun/threads/threads/threads/dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop}
DiemainThread()
Die Funktion wird verwendet, um das Gewindeobjekt des Hauptgewindes zu erhalten, d. h. das Gewinde, bei dem diemain()
die Funktion in der Strategie liegt.
DiemainThread()
Funktion gibt das Thread-Objekt des Hauptthreads zurück.
Thread
Gegenstand
Hauptthread (()
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
Holen Sie dieThread
Objekt des Hauptgurtes und Ausgang derthreadId
von der Hauptschnur.
function test() {
Log("Output the main thread ID in the test function:", threading.mainThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Das Gewindeobjekt des Hauptgewindes kann auch in gleichzeitigen Gewinden gewonnen werden.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/getThread getThread}, {@fun/Threads/threading/thread thread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/threads/threading/condition condition}, {@fun/threads/threading/event event}, {@fun/threads/threads/threading/Dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop eventLoop}
DiecurrentThread()
Funktion wird verwendet, um das Thread-Objekt des aktuellen Threads zu erhalten.
DiecurrentThread()
Funktion gibt das Thread-Objekt des aktuellen Threads zurück.
Thread
Gegenstand
Der aktuelle Thread (((
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Holen Sie dieThread
Gegenstand des Stromdrehs und Ausgang derthreadId
Der aktuelle Faden.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/Threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/condition condition}, {@fun/threads/threading/event event}, {@fun/threads/threading/event dictt}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/event Loop event Loop}, {@fun/threads/threading/event Loop}
DieLock()
Die Funktion wird verwendet, um ein Thread-Lock-Objekt zu erstellen.
DieLock()
Funktion gibt ein Threadlock-Objekt zurück.
ThreadLock
Gegenstand
Schließung
function consumer(productionQuantity, dict, lock) {
for (var i = 0; i < productionQuantity; i++) {
lock.acquire()
var count = dict.get("count")
Log("consumer:", count)
Sleep(1000)
lock.release()
}
}
function producer(productionQuantity, dict, lock) {
for (var i = 0; i < productionQuantity; i++) {
lock.acquire()
dict.set("count", i)
Log("producer:", i)
Sleep(1000)
lock.release()
}
}
function main() {
var dict = threading.Dict()
dict.set("count", -1)
var lock = threading.Lock()
var productionQuantity = 10
var producerThread = threading.Thread(producer, productionQuantity, dict, lock)
var consumerThread = threading.Thread(consumer, productionQuantity, dict, lock)
consumerThread.join()
producerThread.join()
}
Zwei gleichzeitige Threads greifen auf eine gemeinsame Ressource zu.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/threadThread}, {@fun/threads/threading/condition Condition}, {@fun/threads/threading/event Event}, {@fun/threads/threading/threading/Dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop event}
DieCondition()
Die Funktion wird verwendet, um ein Objekt der Bedingungsvariablen zu erstellen, das zur Synchronisierung und Kommunikation zwischen Threads in einer mehrthreadigen gleichzeitigen Umgebung verwendet wird.Condition()
, kann ein Thread warten, wenn bestimmte Bedingungen nicht erfüllt sind, bis ein anderer Thread ihm mitteilt, dass die Bedingung erfüllt ist.
DieCondition()
Funktion gibt a zurückThreadCondition
object.
ThreadCondition
Gegenstand
Zustand
function consumer(productionQuantity, dict, condition) {
for (var i = 0; i < productionQuantity; i++) {
condition.acquire()
while (dict.get("array").length == 0) {
condition.wait()
}
var arr = dict.get("array")
var count = arr.shift()
dict.set("array", arr)
Log("consumer:", count, ", array:", arr)
condition.release()
Sleep(1000)
}
}
function producer(productionQuantity, dict, condition) {
for (var i = 0; i < productionQuantity; i++) {
condition.acquire()
var arr = dict.get("array")
arr.push(i)
dict.set("array", arr)
Log("producer:", i, ", array:", arr)
condition.notify()
condition.release()
Sleep(1000)
}
}
function main() {
var dict = threading.Dict()
dict.set("array", [])
var condition = threading.Condition()
var productionQuantity = 10
var producerThread = threading.Thread(producer, productionQuantity, dict, condition)
var consumerThread = threading.Thread(consumer, productionQuantity, dict, condition)
consumerThread.join()
producerThread.join()
}
Zwei gleichzeitige Threads greifen auf eine gemeinsame Ressource zu.
Das Backtesting-System implementiert diese Funktionalität nicht, es definiert sie nur.
{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/thread Thread}, {@fun/threads/threading/event Event}, {@fun/threads/threading/Dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop Loop}
DieEvent()
Funktion wird verwendet, um eineThread-EreignisObjekt, das für die Synchronisierung zwischen Threads verwendet wird, sodass ein Thread auf eine Benachrichtigung oder ein Signal von einem anderen Thread warten kann.
DieEvent()
Funktion gibt a zurückThreadEvent
object.
ThreadEvent
Gegenstand
Ereignis
function consumer(productionQuantity, dict, pEvent, cEvent) {
for (var i = 0; i < productionQuantity; i++) {
while (dict.get("array").length == 0) {
pEvent.wait()
}
if (pEvent.isSet()) {
pEvent.clear()
}
var arr = dict.get("array")
var count = arr.shift()
dict.set("array", arr)
Log("consumer:", count, ", array:", arr)
cEvent.set()
Sleep(1000)
}
}
function producer(productionQuantity, dict, pEvent, cEvent) {
for (var i = 0; i < productionQuantity; i++) {
while (dict.get("array").length != 0) {
cEvent.wait()
}
if (cEvent.isSet()) {
cEvent.clear()
}
var arr = dict.get("array")
arr.push(i)
dict.set("array", arr)
Log("producer:", i, ", array:", arr)
pEvent.set()
Sleep(1000)
}
}
function main() {
var dict = threading.Dict()
dict.set("array", [])
var pEvent = threading.Event()
var cEvent = threading.Event()
var productionQuantity = 10
var producerThread = threading.Thread(producer, productionQuantity, dict, pEvent, cEvent)
var consumerThread = threading.Thread(consumer, productionQuantity, dict, pEvent, cEvent)
consumerThread.join()
producerThread.join()
}
Zwei gleichzeitige Threads greifen auf eine gemeinsame Ressource zu.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/threads/threading/condition Condition}, {@fun/threads/threading/threading/thread Thread}, {@fun/threads/threading/Dict Dict}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop eventop}
DieDict()
Die Funktion wird verwendet, um ein Wörterbuchobjekt zu erstellen, das an gleichzeitige Threads übergeben wird.
DieDict()
Funktion gibt a zurückThreadDict
object.
ThreadDict
Gegenstand
Das ist ein Diktat.
function threadFun1(obj) {
obj["age"] = 100
while (true) {
Log("threadFun1 obj:", obj)
Sleep(5000)
}
}
function threadFun2(obj) {
while (true) {
Log("threadFun2 obj:", obj)
Sleep(5000)
}
}
function main() {
var obj = {"age": 10}
var t1 = threading.Thread(threadFun1, obj)
var t2 = threading.Thread(threadFun2, obj)
t1.join()
t2.join()
}
Übertragen eines normalen Objekts an die gleichzeitige Thread-Ausführungsfunktion, um zu testen, ob die Änderung des Schlüsselwerts des Objekts Änderungen des Schlüsselwerts des Objekts in anderen Threads bewirkt.
function threadFun1(threadDict) {
threadDict.set("age", 100)
while (true) {
Log(`threadFun1 threadDict.get("age"):`, threadDict.get("age"))
Sleep(5000)
}
}
function threadFun2(threadDict) {
while (true) {
Log(`threadFun2 threadDict.get("age"):`, threadDict.get("age"))
Sleep(5000)
}
}
function main() {
var threadDict = threading.Dict()
threadDict.set("age", 10)
var t1 = threading.Thread(threadFun1, threadDict)
var t2 = threading.Thread(threadFun2, threadDict)
t1.join()
t2.join()
}
Geben Sie mir dieThreadDict
Ein Objekt, das von derDict()
Funktion an die gleichzeitige Thread-Ausführungsfunktion und prüfen, ob die Änderung des Schlüsselwerts des Objekts dazu führt, dass sich der Schlüsselwert des Objekts in anderen Threads ändert.
Wenn ein gemeinsames Objekt an eine gleichzeitige Thread-Funktion weitergegeben wird, wird es als Deep Copy weitergegeben.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/threads/threading/condition Condition}, {@fun/threads/threading/event Event}, {@fun/threads/threading/threading/thread Thread}, {@fun/threads/threading/pending pending}, {@fun/threads/threading/eventLoop}
Diepending
Funktion wird verwendet, um die Anzahl der gleichzeitigen Threads zu erhalten, die im aktuellen Strategieprogramm ausgeführt werden.
Diepending()
Funktion gibt die Anzahl der gleichzeitigen Threads zurück, die das aktuelle Strategieprogramm ausführt.
Zahl
Ausstehend
function threadFun1() {
Log("threadFun1")
Sleep(3000)
}
function threadFun2() {
for (var i = 0; i < 3; i++) {
LogStatus(_D(), "print from threadFun2")
Sleep(3000)
}
}
function main() {
Log(`begin -- threading.pending():`, threading.pending())
var t1 = threading.Thread(threadFun1)
var t2 = threading.Thread(threadFun2)
Log(`after threading.Thread -- threading.pending():`, threading.pending())
t1.join()
t2.join()
Log(`after thread.join -- threading.pending():`, threading.pending())
}
Erstellen Sie zwei gleichzeitig laufende Threads und rufen Sie diepending()
Funktion in verschiedenen Zeitknoten.
Wenn die Strategiemain()
Funktion beginnt zu laufen, ruft die Funktionpending()
direkt 1 zurückgeben wird, weil der Haupt-Thread, wo die Strategiemain()
Funktion ist auch ein ausstehender Thread.
Es unterstützt Backtesting-System und Live-Handelsumgebung.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/threads/threading/condition Condition}, {@fun/threads/threading/event Event}, {@fun/threads/threading/threading/Dict Dict}, {@fun/threads/threading/thread Thread}, {@fun/threads/threading/eventLoop}
Thread
Objekte können erstellt oder zurückgegeben werdenthreading.Thread()
, threading.getThread()
, threading.mainThread()
, undthreading.currentThread()
.
DiepeekMessage()
Funktion wird verwendet, um eine Nachricht von einem Thread zu erhalten.
DiepeekMessage()
Funktion gibt die Nachricht zurück, die vom Thread empfangen wurde, der mit dem aktuellen Thread-Objekt verknüpft ist.
Zeichenfolge, Zahl, bool, Objekt, Array, Nullwert und andere vom System unterstützte Typen
Ein BlickMessage() Sieh nach Nachricht (Timeout)
Der Parametertimeout
ist die Timeout-Einstellung. Sie blockiert und wartet auf die Anzahl der Millisekunden, die vom Parameter festgelegt werden, und gibt Daten zurück. Wenn keine Daten vorliegen und die Timeout-Einstellung das Limit überschreitet, wird ein Nullwert zurückgegeben.timeout
ist auf 0 oder dietimeout
Wenn die Daten des Kanals nicht übergeben werden, wird der Prozess blockiert und wartet, bis Daten aus dem Kanal empfangen werden.timeout
ist auf -1 gesetzt, bedeutet dies, dass der Prozess Daten nicht sofort blockiert und zurückgibt.
Zeitverzögerung falsche Zahl
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 10; i++) {
Log("thread1 postMessage():", i)
threading.mainThread().postMessage(i)
Sleep(500)
}
})
while (true) {
var msg = threading.currentThread().peekMessage()
Log("main peekMessage():", msg)
if (msg == 9) {
break
}
Sleep(1000)
}
t1.join()
}
Senden Sie Nachrichten an den Hauptthread von einem gleichzeitigen Thread.
Beim Schreiben von Programmen müssen wir auf Thread-Standstillstandsprobleme achten.
{@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/threads/Thread/name}, {@Threads/threads/eventLoop EventLoop}
DiepostMessage()
Funktion wird verwendet, um eine Nachricht an einen Thread zu senden.
PostNachricht ((msg)
Der Parametermsg
ist die Botschaft, die gesendet wird.
Msg - Das stimmt. Jeder vom System unterstützte Typ, z. B. Zeichenfolge, Zahl, bool, Objekt, Array, Funktion, Nullwert usw.
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 10; i++) {
Log("thread1 postMessage():", i)
threading.mainThread().postMessage(i)
Sleep(500)
}
})
for (var i = 0; i < 10; i++) {
var event = threading.mainThread().eventLoop()
Log("main event:", event)
Sleep(500)
}
t1.join()
}
Senden von Nachrichten in gleichzeitigen Threads und VerwendungeventLoop()
um Benachrichtigungen über Nachrichten zu erhalten.
function main() {
threading.mainThread().postMessage(function(msg) {
Log("func from mainThread, msg:", msg)
})
threading.Thread(function() {
var func = threading.mainThread().peekMessage()
func("in " + threading.currentThread().name())
}).join()
}
Es unterstützt das Senden einer Funktion.
Wenn die Ausführungsfunktion eines Threads diepostMessage()
Wir können die Funktion verwenden, um ein Signal oder Daten zu senden, ein Nachrichtenereignis wird auch generiert.eventLoop()
Funktion zum Empfangen von Nachrichtenbenachrichtigungen.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
Diejoin()
Funktion wird verwendet, um zu warten, bis der Thread aussteigt und die Systemressourcen zurückfordert.
DieThreadRet
Gegenstandenthält Daten über das Ausführungsergebnis. Zu den Eigenschaften gehören:
ThreadRet
Gegenstand
Ich bin ein Teil von dir. Teilnahme (Timeout)
Dietimeout
Die Zeitdauer in Millisekunden für das Warten auf das Ende des Threads wird verwendet.timeout
Parameter auf 0 oder dietimeout
Parameter nicht eingestellt ist,join()
Funktion wird blockieren und warten, bis der Thread ausführt.timeout
Der Parameter ist auf -1,join()
Die Funktion wird sofort wiederhergestellt.
Zeitverzögerung falsche Zahl
function main() {
var t1 = threading.Thread(function() {
Log("Hello thread1")
Sleep(5000)
})
var ret = t1.join(1000)
Log("ret:", ret) // ret: undefined
ret = t1.join()
Log("ret:", ret) // ret: {"id":1,"terminated":false,"elapsed":5003252000}
}
Test derjoin()
Funktion für Timeout und Ausgabe des Rückgabewerts.
Diejoin()
Funktionszeiten aus und zurückundefined
.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Dieterminate()
Funktion wird verwendet, um einen Thread zwangsweise zu beenden und die Hardware-Ressourcen freizugeben, die vom erstellten Thread verwendet werden.
beenden
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 10; i++) {
Log("thread1 i:", i)
Sleep(1000)
}
})
Sleep(3000)
t1.terminate()
Log("after t1.terminate()")
while (true) {
LogStatus(_D())
Sleep(1000)
}
}
Die Ausführung eines Threads wird gewaltsam beendet. Nach dem gewaltsamen Beenden eines Threads gibt es keinen Ausgang aus diesem Thread im Protokoll.
Für Fäden, die gewaltsam durch dieterminate()
Wir können nicht mehr diejoin()
Funktion, um zu warten, bis sie beendet werden.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
DiegetData()
Diese Funktion wird verwendet, um auf Variablen zuzugreifen, die in der Thread-Umgebung aufgezeichnet sind.join()
Funktion (Wartend auf erfolgreichen Ausgang) und hat dieterminate()
Funktion (Zwangsschließung des Gurtes).
DiegetData()
Funktion gibt den Schlüsselwert zurückkey
Parameter im Schlüssel-Wert-Paar, das im aktuellen Thread-Kontext gespeichert ist.
Zeichenfolge, Zahl, bool, Objekt, Array, Nullwert und andere vom System unterstützte Typen
GetDaten (siehe unten) GetData (Schlüssel)
Diekey
Parameter ist der Schlüsselname des gespeicherten Schlüssel-Wert-Paares.
Schlüssel wahr String
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 5; i++) {
threading.currentThread().setData("count", i)
Log(`setData("count"):`, i)
Sleep(1000)
}
})
for (var i = 0; i < 5; i++) {
var count = threading.getThread(t1.id()).getData("count")
Log(`getData("count"):`, count)
Sleep(1000)
}
t1.join()
}
Wert des Schlüssels erfassencount
in der gleichzeitigen Thread-Umgebung, und dann lesen Sie den Schlüsselwert voncount
in den Hauptgedanken.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
DiesetData()
Funktion wird verwendet, um Variablen im Thread-Kontext zu speichern.
SetDaten (Schlüssel, Wert)
Diekey
Parameter wird verwendet, um den Schlüsselnamen des gespeicherten Schlüssel-Wert-Paares anzugeben.
Schlüssel
wahr
String
Dievalue
Parameter wird verwendet, um den Schlüsselwert des gespeicherten Schlüssel-Wert-Paares anzugeben.
Wert - Das stimmt. Jeder vom System unterstützte Typ, z. B. Zeichenfolge, Zahl, bool, Objekt, Array, Funktion, Nullwert usw.
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Sleep(1000)
Log(`t1.getData("data"):`, t1.getData("data"))
t1.join()
}
Setzen Sie das Schlüssel-Wert-Paar im gleichzeitigen Thread und lesen Sie das Schlüssel-Wert-Paar im Hauptthread.
function main() {
threading.mainThread().setData("func2", function(p) {
Log("func2 p:", p)
})
var t1 = threading.Thread(function() {
threading.currentThread().setData("func1", function(p) {
Log("func1 p:", p)
})
var func2 = threading.mainThread().getData("func2")
func2("test2")
})
Sleep(1000)
var func1 = t1.getData("func1")
func1("test1")
t1.join()
}
Es unterstützt die Übertragung von Schlüsselwerten auf Funktionen.
Die Daten sind gültig, wenn der Thread diejoin()
Funktion (Wartend auf erfolgreichen Ausgang) und hat dieterminate()
Funktion (Zwangsbeenden des Threads).value
muss eine serialisierbare Variable sein.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
Dieid()
Funktion wird verwendet, um diethreadId
der aktuellen multithreaded Objektinstanz.
Der Rücklaufwert derid()
Funktion istthreadId
.
Zahl
Die Daten sind hier:
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}
Erstellen Sie einen gleichzeitig laufenden Thread und geben Sie diethreadId
von diesem gleichlaufenden Faden im Hauptfaden.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Diename()
Funktion wird verwendet, um den Namen der aktuellen Multithreaded-Objektinstanz zurückzugeben.
Diename()
Funktion gibt den gleichzeitigen Threadnamen zurück.
String
Name (n)
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}
Erstellen Sie einen gleichzeitigen Thread und geben Sie den Namen des gleichzeitigen Threads im Hauptthread aus.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/eventLoop eventLoop}
DieeventLoop()
Die Funktion wird verwendet, um die vom Thread empfangenen Ereignisse anzuhören.
DieeventLoop()
Funktion gibt die vom aktuellen Thread empfangenen Ereignisinformationen zurück. SieheVeranstaltungsinformationsstruktur.
Objekt, Nullwert
EventLoop ((() EventLoop (Zeitrahmen)
Der Parametertimeout
ist die Timeout-Einstellung in Millisekunden.timeout
ist auf 0 gesetzt, wartet es, bis ein Ereignis stattfindet, bevor es zurückkehrt. Wenn es größer als 0 ist, setzt es das Ereignis auf Wartezeit. Wenn es kleiner als 0 ist, gibt es sofort das letzte Ereignis zurück.
Zeitverzögerung falsche Zahl
function main() {
var t1 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop() // Blocking wait
// 2024-11-14 10:14:18 thread1 eventMsg: {"Seq":1,"Event":"thread","ThreadId":0,"Index":1,"Queue":0,"Nano":1731550458699947000}
Log(_D(), "thread1 eventMsg:", eventMsg)
}
})
var t2 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop(-1) // Return immediately
Log(_D(), "thread2 eventMsg:", eventMsg)
Sleep(5000)
}
})
var t3 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop(3000) // Set a 3 second timeout
Log(_D(), "thread3 eventMsg:", eventMsg)
}
})
t1.postMessage("Hello ", t1.name())
t2.postMessage("Hello ", t2.name())
t3.postMessage("Hello ", t3.name())
t1.join()
t2.join()
t3.join()
}
Führen Sie drei Threads gleichzeitig aus und geben Sie die empfangenen Ereignisinformationen aus.
Der Verarbeitungsmechanismus dereventLoop()
Funktion ist die gleiche wie die globale FunktionEventLoop()
.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}
Thread-Lock-Objekt, für die Synchronisierung von mehreren Threads verwendet.
Dieacquire()
Die Funktion wird verwendet, um ein Threadlock (Schließen) anzufordern.
Erwerben
Siehethreading.Lock()
Abschnitt für Beispiele.
Dieacquire()
Wenn ein Thread die Funktion "Thread Lock" anruft, wird die Funktion "Thread Lock" verwendet.acquire()
Wenn der Schloss nicht von einem anderen Thread gehalten wird, erhält der aufrufende Thread den Schloss erfolgreich und setzt die Ausführung fort. Wenn der Schloss bereits von einem anderen Thread gehalten wird, wird der aufrufende Threadacquire()
wird blockiert, bis das Schloss freigegeben ist.
Ich habe eine Frage. Ich habe eine Frage.
Dierelease()
Die Funktion wird verwendet, um ein Gewindeverriegelung (Entriegelung) zu lösen.
Freisetzung
function consumer(productionQuantity, dict, pLock, cLock) {
for (var i = 0; i < productionQuantity; i++) {
pLock.acquire()
cLock.acquire()
var arr = dict.get("array")
var count = arr.shift()
dict.set("array", arr)
Log("consumer:", count, ", array:", arr)
cLock.release()
Sleep(1000)
pLock.release()
}
}
function producer(productionQuantity, dict, pLock, cLock) {
for (var i = 0; i < productionQuantity; i++) {
cLock.acquire() // cLock.acquire() placed after pLock.acquire() will not cause deadlock
pLock.acquire()
var arr = dict.get("array")
arr.push(i)
dict.set("array", arr)
Log("producer:", i, ", array:", arr)
pLock.release()
Sleep(1000)
cLock.release()
}
}
function main() {
var dict = threading.Dict()
dict.set("array", [])
var pLock = threading.Lock()
var cLock = threading.Lock()
var productionQuantity = 10
var producerThread = threading.Thread(producer, productionQuantity, dict, pLock, cLock)
var consumerThread = threading.Thread(consumer, productionQuantity, dict, pLock, cLock)
consumerThread.join()
producerThread.join()
}
Prüfung von Stillstandsszenarien
Es ist zu beachten, dass eine unsachgemäße Verwendung von Fadenverschlüssen zu einer Sackgasse führen kann.
Ich bin nicht derjenige, der das Problem hat, aber ich bin derjenige, der es hat.
Ereignisobjekt, das für mehrstufige Ereignisbenachrichtigungen und -signale verwendet wird.
Dieset()
Funktion wird verwendet, um Ereignisse zu benachrichtigen (Satzsignale).
Einheitlich
Siehethreading.Event()
Abschnitt für Beispiele.
Wenn das Signal mitset()
Wir müssen das Signal löschen und wieder einstellen.
{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Dieclear()
Die Funktion wird verwendet, um das Signal zu löschen.
Klar, klar.
Siehethreading.Event()
Abschnitt für Beispiele.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Diewait()
Die Funktion wird verwendet, um ein Ereignis (Signal) warten zu lassen, und wird blockiert, bevor das Ereignis (Signal) gesetzt wird. Sie unterstützt das Setzen eines Timeouts.
Diewait()
Wenn dies der Fall ist, gibt es einen wahren Wert.
Boole
Warten Sie. Warten Sie.
Dietimeout
Der Parameter wird verwendet, um die Wartezeit in Millisekunden festzulegen.
Zeitverzögerung falsche Zahl
function main() {
var event = threading.Event()
var t1 = threading.Thread(function(event) {
var ret = event.wait(100)
Log(`event.wait(100):`, ret)
ret = event.wait()
Log(`event.wait():`, ret)
}, event)
Sleep(1000)
event.set()
t1.join()
}
Testen Sie den Rückgabewert derwait()
function.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}
DieisSet()
Funktion wird verwendet, um festzustellen, ob ein Ereignis (Signal) eingestellt wurde.
DieisSet()
Funktion gibt zurück, ob das Ereignis (Signal) eingestellt wurde; wenn das Ereignis (Signal) eingestellt wurde, gibt sie einen wahren Wert zurück.
Boole
istSet()
Siehethreading.Event()
Abschnitt für Beispiele.
Das ist eine sehr schwierige Sache.
Bedingungsgegenstand, für die Synchronisierung von mehreren Threads verwendet.
Dienotify()
Funktion wird verwendet, um einen wartenden Thread (falls vorhanden) aufzuwecken.wait()
Die Methode wird aufgewacht.
Anmeldung
function consumer(dict, condition) {
while (true) {
condition.acquire()
while (dict.get("array").length == 0) {
Log(threading.currentThread().name(), "wait()...", ", array:", dict.get("array"))
condition.wait()
}
var arr = dict.get("array")
var num = arr.shift()
Log(threading.currentThread().name(), ", num:", num, ", array:", arr, "#FF0000")
dict.set("array", arr)
Sleep(1000)
condition.release()
}
}
function main() {
var condition = threading.Condition()
var dict = threading.Dict()
dict.set("array", [])
var t1 = threading.Thread(consumer, dict, condition)
var t2 = threading.Thread(consumer, dict, condition)
var t3 = threading.Thread(consumer, dict, condition)
Sleep(1000)
var i = 0
while (true) {
condition.acquire()
var msg = ""
var arr = dict.get("array")
var randomNum = Math.floor(Math.random() * 5) + 1
if (arr.length >= 3) {
condition.notifyAll()
msg = "notifyAll"
} else {
arr.push(i)
dict.set("array", arr)
if (randomNum > 3 && arr.length > 0) {
condition.notify()
msg = "notify"
} else {
msg = "pass"
}
i++
}
Log(_D(), "randomNum:", randomNum, ", array:", arr, ", msg:", msg)
condition.release()
Sleep(1000)
}
}
Verwendennotify()
Funktion, um den wartenden Faden zu wecken.
Dienotify()
Funktion weckt einen Thread in der Warteschlange.
Wenn dienotify()
Wenn eine Funktion einen Thread weckt, erhält der Thread das Thread-Lock zurück.
{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
DienotifyAll()
Funktion weckt alle wartenden Threads auf.
Benachrichtigen Sie alle.
SieheThreadCondition.notify()
Abschnitt für Beispiele.
DienotifyAll()
Die Funktion weckt alle wartenden Threads einzeln auf, und die erwachten Threads erwerben das Threadlock wieder.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Diewait()
Die Funktion wird verwendet, um einen Faden unter bestimmten Bedingungen warten zu lassen.
Warten Sie.
SieheThreadCondition.notify()
Abschnitt für Beispiele.
Diewait()
Die Funktion entlässt die Schraube und erhält die Schraube wieder, wenn man aufwacht.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Dieacquire()
Die Funktion wird verwendet, um ein Threadlock (Schließen) anzufordern.
Erwerben
SieheThreadCondition.notify()
Abschnitt für Beispiele.
Vor Gebrauchwait()
, müssen Sie das Thread-Lock (Lock) des aktuellen Condition-Objekts anfordern.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}
Dierelease()
Die Funktion wird verwendet, um ein Gewindeverriegelung (Entriegelung) zu lösen.
Freisetzung
SieheThreadCondition.notify()
Abschnitt für Beispiele.
Nach Gebrauchwait()
, müssen wir das Thread-Lock (Unlock) des aktuellen Condition-Objekts freigeben.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}
Wörterbuchobjekt, zum Teilen von Daten verwendet.
Dieget()
Die Funktion wird verwendet, um den im Wörterbuchobjekt aufgezeichneten Schlüsselwert zu erhalten.
Dieget()
Funktion gibt den Wert des Schlüssels zurück, der von derkey
parameter.
Zeichenfolge, Zahl, bool, Objekt, Array, Nullwert und andere vom System unterstützte Typen
Get (Schlüssel)
Diekey
Parameter wird verwendet, um den Schlüsselnamen anzugeben, der dem zu erhaltenden Schlüssel entspricht.
Schlüssel wahr String
function main() {
var event = threading.Event()
var dict = threading.Dict()
dict.set("data", 100)
var t1 = threading.Thread(function(dict, event) {
Log(`thread1, dict.get("data"):`, dict.get("data"))
event.set()
event.clear()
event.wait()
Log(`after main change data, thread1 dict.get("data"):`, dict.get("data"))
dict.set("data", 0)
}, dict, event)
event.wait()
dict.set("data", 99)
event.set()
event.clear()
t1.join()
Log(`main thread, dict.get("data"):`, dict.get("data"))
}
Verwenden Sie Ereignisobjekte, um Threads zu benachrichtigen, um Daten zu lesen und zu ändern.
Ich bin nicht derjenige, der das Problem hat.
Dieset()
Die Funktion wird verwendet, um ein Schlüssel-Wert-Paar festzulegen.
Set (Schlüssel, Wert)
Der Parameterkey
wird verwendet, um den zu ändernden Schlüsselnamen festzulegen.
Schlüssel
wahr
String
Der Parametervalue
wird verwendet, um den zu ändernden Schlüsselwert festzulegen.
Wert - Das stimmt. String, Zahl, bool, Objekt, Array, Funktion, Nullwert und andere vom System unterstützte Typen
function main() {
var dict1 = threading.Dict()
dict1.set("func1", function(p) {
Log("func1 p:", p)
})
threading.Thread(function(dict1) {
var func1 = dict1.get("func1")
func1("test")
}, dict1).join()
}
Es unterstützt die Übertragung von Schlüsselwerten auf Funktionen.
Ich bin ein guter Freund.
Netzeinstellungen Web3