La plate-forme de négociation quantitative FMZ prend réellement en charge la fonction multi-threaded duJavaScript
La stratégie linguistique est mise en place de bas en haut du système et vise à atteindre les objectifs suivants:
Objets | Directions de conduite | Les commentaires |
---|---|---|
filtrage | Objet global à plusieurs fils | Les fonctions des membres:Thread , getThread , mainThread , etc. |
Le fil | Objet de fil | Les fonctions des membres:peekMessage , postMessage , join , etc. |
Fermeture de fil | Objet de verrouillage de fil | Les fonctions des membres:acquire , release . Ils peuvent être passés dans l'environnement du thread en tant que paramètres de la fonction d'exécution du thread. |
ThreadÉvénement | Objet événement | Les fonctions des membres:set , clear , wait , isSet . Ils peuvent être passés dans l'environnement du thread comme paramètre de la fonction d'exécution du thread. |
ThreadCondition | Objet de condition | Les fonctions des membres:notify , notifyAll , wait , acquire , release . Ils peuvent être passés dans l'environnement du thread comme paramètre de la fonction d'exécution du thread. |
ThreadDict | Objet du dictionnaire | Les fonctions des membres:get , set . Ils peuvent être passés dans l'environnement du thread en tant que paramètres de la fonction d'exécution du thread. |
Lethreading
Objet est un outil de gestion multi-threading global qui fournit des fonctions telles que la création de threads concurrents, de verrouillage de thread et d'objets condition.threading
Cet objet n'est pris en charge que par leJavaScript
stratégie linguistique.
LeThread()
la fonction est utilisée pour créer des threads simultanés.
LeThread()
La fonction renvoie aThread
objet, qui est utilisé pour gérer les threads simultanés créés, la communication des threads, etc.
Thread
objet
Je ne sais pas si c'est vrai. Thème (s)
Le paramètrefunc
est une fonction d'exécution simultanée (passée par référence) et prend en charge le passage de fonctions anonymes.func
peut accepter plusieurs paramètres, qui seront transmis à travers...args
Par conséquent, la liste de paramètres defunc
doit être conforme à...args
.
fonction
vrai
fonction
Le paramètrearg
est le paramètre réel passé àfunc
(c'est-à-dire la fonction d'exécution simultanée du thread) lorsque le rappel est exécuté; il peut y avoir plusieurs paramètresarg
, et la liste des paramètres defunc
doit être conforme à...args
.
arg
faux
chaîne, nombre, bool, objet, tableau, fonction, valeur nulle et autres types pris en charge par le système
Le paramètreitem
est un tableau contenant les références de fonction et leurs paramètres à exécuter simultanément.item
Les paramètres peuvent être passés lors de l'appel duThread
function.
point vrai séquence
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()
}
Créez des threads simultanés pour une fonction personnalisée et une fonction anonyme.
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()
}
Utilisez leThread(...items)
forme pour créer des threads simultanés et exécuter plusieurs fonctions séquentiellement.
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()
}
Il prend en charge le passage de paramètres à des fonctions exécutées simultanément.
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)
}
Il prend en charge le passage de chaînes de fonctions et peut importer des bibliothèques externes de manière dynamique pour le calcul simultané.
La fonction de filfunc
passé dans leThread()
Une fonction pour l'exécution simultanée s'exécute dans un environnement isolé, de sorte que les variables en dehors du thread ne peuvent pas être directement référencées, et la compilation échouera lorsqu'elle est référencée.
Il prend en charge le système de backtesting et l'environnement de trading en direct. Toutes les fonctions liées aux threads concurrents ne sont prises en charge que comme compatibilité de code dans le système de backtesting et ne seront pas réellement exécutées par des threads concurrents, elles ne seront donc pas répétées dans ce chapitre.
{@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/threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}
LegetThread()
fonction est utilisée pour obtenir l'objet de thread basé sur l'ID de thread spécifié.
LegetThread()
Retourne leThread
objet avec le threadId spécifié par le paramètre
Thread
objet
Je ne sais pas si c'est vrai.
Le paramètrethreadId
est l'ID de l'objet de thread. Obtenez l'objet de thread correspondant en spécifiant le paramètre.
Le fil vrai Numéro
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())
}
Obtenir l'objet de thread spécifiéthreadId
.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
Si le fil que vous voulez obtenir a été exécuté et libéré, vous ne pouvez pas utiliserthreading.getThread(threadId)
pour obtenir l'objet du fil du fil.
{@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/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
LemainThread()
fonction est utilisée pour obtenir l'objet de fil du fil principal, c'est-à-dire le fil où lemain()
La fonction dans la stratégie est localisée.
LemainThread()
la fonction renvoie l'objet de thread du thread principal.
Thread
objet
le fil principal (((
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
Prends leThread
l'objet du fil principal et la sortiethreadId
du fil conducteur.
function test() {
Log("Output the main thread ID in the test function:", threading.mainThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
L'objet de fil du fil principal peut également être obtenu dans des fils concurrents.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@fun/Threads/getThread getThread}, {@fun/Threads/threads/threading/Thread Thread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
LecurrentThread()
la fonction est utilisée pour obtenir l'objet thread du thread actuel.
LecurrentThread()
la fonction renvoie l'objet de thread du thread en cours.
Thread
objet
Le fil de discussion actuel
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Prends leThread
l'objet du fil de courant et la sortiethreadId
du fil actuel.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threads/threading/event Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/threads/threads/threading/eventLoop}, {@fun/threads/threads/threads/ev
LeLock()
la fonction est utilisée pour créer un objet de verrouillage de thread.
LeLock()
la fonction renvoie un objet de verrouillage de thread.
ThreadLock
objet
Fermeture
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()
}
Deux fils concurrents accèdent à une ressource commune.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threads/threading/threadThread}, {@fun/Threads/threads/threading/condition Condition}, {@fun/Threads/threads/threading/event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop}
LeCondition()
fonction est utilisée pour créer un objet variable de condition, qui est utilisé pour réaliser la synchronisation et la communication entre les threads dans un environnement concurrent multi-threaded.Condition()
, un thread peut attendre lorsque certaines conditions ne sont pas remplies jusqu'à ce qu'un autre thread l'informe que la condition a été remplie.
LeCondition()
La fonction renvoie aThreadCondition
object.
ThreadCondition
objet
Condition (s)
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()
}
Deux fils concurrents accèdent à une ressource commune.
Le système de backtesting ne met pas en œuvre cette fonctionnalité, il la définit seulement.
{@fun/Threads/getThread getThread}, {@fun/Threads/threads/mainThread mainThread}, {@fun/Threads/threads/currentThread currentThread}, {@fun/Threads/threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Thread Thread}, {@fun/Threads/threads/threading/event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}
LeEvent()
fonction est utilisée pour créer unévénement de filobjet, qui est utilisé pour la synchronisation entre les threads, permettant à un thread d'attendre une notification ou un signal d'un autre thread.
LeEvent()
La fonction renvoie aThreadEvent
object.
ThreadEvent
objet
Événement
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()
}
Deux fils concurrents accèdent à une ressource commune.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@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}
LeDict()
fonction est utilisée pour créer un objet de dictionnaire pour passer à des threads concurrents.
LeDict()
La fonction renvoie aThreadDict
object.
ThreadDict
objet
Le dictionnaire
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()
}
Passer un objet normal à la fonction d'exécution de thread concurrent pour tester si la modification de la valeur de clé de l'objet entraînera des modifications de la valeur de clé de l'objet dans d'autres threads.
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()
}
Passe leThreadDict
l'objet créé par leDict()
fonction à la fonction d'exécution de thread en parallèle, et tester si la modification de la valeur de clé de l'objet entraînera la modification de la valeur de clé de l'objet dans d'autres threads.
Lorsqu'un objet commun est passé à une fonction de thread concurrent, il est passé comme une copie profonde.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@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/threading/pending pending}, {@fun/Threads/threading/eventLoop}
Lepending
fonction est utilisée pour obtenir le nombre de threads simultanés exécutés dans le programme de stratégie en cours.
Lepending()
la fonction renvoie le nombre de threads simultanés que le programme de stratégie en cours exécute.
Numéro
En attente
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())
}
Créez deux threads en cours d'exécution simultanée et appelez lepending()
fonctionner à différents nœuds horaires.
Lorsque la stratégiemain()
fonction commence à fonctionner, appelant la fonctionpending()
directement renverra 1, parce que le fil principal où la stratégiemain()
fonction est situé est également un fil en attente.
Il prend en charge le système de backtesting et l'environnement de trading en direct.
{@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/Thread Thread}, {@fun/Threads/threading/eventLoop}
Thread
Les objets peuvent être créés ou retournés parthreading.Thread()
, threading.getThread()
, threading.mainThread()
, etthreading.currentThread()
.
LepeekMessage()
la fonction est utilisée pour obtenir un message d'un thread.
LepeekMessage()
fonction renvoie le message reçu par le thread associé à l'objet de thread en cours.
chaîne, nombre, bool, objet, tableau, valeur nulle et autres types pris en charge par le système
Je suis en train de lire un article. Je suis en train d'essayer d'arrêter.
Le paramètretimeout
est le paramètre de temps d'arrêt. Il bloque et attend le nombre de millisecondes défini par le paramètre et renvoie les données. S'il n'y a pas de données et que le temps d'arrêt dépasse la limite, une valeur nulle est renvoyée. Sitimeout
est réglé sur 0 ou letimeout
si le paramètre n'est pas passé, cela signifie que le processus va bloquer et attendre jusqu'à ce que les données soient reçues du canal.timeout
Si la valeur est réglée sur -1, cela signifie que le processus ne bloquera pas et ne renverra pas les données immédiatement.
temps d'arrêt faux Numéro
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()
}
Envoyer des messages au fil principal à partir d'un fil concurrent.
Lorsque nous écrivons des programmes, nous devons prêter attention aux problèmes d'impasse des threads.
{@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/Threads/Thread/name name}, {@Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}
LepostMessage()
fonction est utilisée pour envoyer un message à un thread.
PostMessage (message)
Le paramètremsg
est le message à envoyer.
Message à envoyer vrai Tout type pris en charge par le système, tel que chaîne, nombre, bool, objet, tableau, fonction, valeur nulle, etc.
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()
}
Envoyer des messages dans des threads simultanés et utilisereventLoop()
pour recevoir des notifications de messages.
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()
}
Il prend en charge l'envoi d'une fonction.
Lorsque la fonction d'exécution d'un thread appelle lepostMessage()
Nous pouvons utiliser la fonction pour envoyer un signal ou des données, un événement de message est également généré.eventLoop()
fonction de réception des notifications de messages.
{@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/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}
Lejoin()
fonction est utilisée pour attendre que le thread sorte et récupère les ressources du système.
LeThreadRet
objetcontient des données sur le résultat de l'exécution.
ThreadRet
objet
rejoignez rejoindre ((timeout)
Letimeout
Le paramètre est utilisé pour définir le temps d'arrêt en millisecondes pour attendre la fin du fil.timeout
paramètre est réglé sur 0 ou letimeout
paramètre n'est pas réglé, lejoin()
fonction va bloquer et attendre jusqu'à ce que le fil termine l'exécution.timeout
le paramètre est réglé sur -1,join()
La fonction va revenir immédiatement.
temps d'arrêt faux Numéro
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}
}
Testez lejoin()
fonction pour le temps d'arrêt et la sortie de la valeur de retour.
Lejoin()
temps de sortie et de retour de la fonctionundefined
.
{@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/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Leterminate()
fonction est utilisée pour mettre fin de force à un thread et libérer les ressources matérielles utilisées par le thread créé.
terminé
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)
}
}
Terminer l'exécution d'un thread par la force. Après avoir terminé un thread par la force, il n'y aura pas de sortie de ce thread dans le journal.
Pour les fils qui sont terminés de force par leterminate()
Nous ne pouvons plus utiliser lejoin()
fonction d'attendre qu'ils se terminent.
{@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/Threads/Thread/name name}, {@fun/Threads/Threads/eventLoop Loop}
LegetData()
Les données sont valables lorsque le thread n'a pas exécuté lejoin()
fonction (en attente de sortie réussie) et n'a pas exécuté leterminate()
fonction (termination du fil par la force).
LegetData()
La fonction renvoie la valeur de clé correspondant à la valeur dekey
paramètre dans la paire clé-valeur stockée dans le contexte du thread en cours.
chaîne, nombre, bool, objet, tableau, valeur nulle et autres types pris en charge par le système
- Je ne sais pas. Je suis en train d' écrire.
Lekey
paramètre est le nom de la clé de la paire clé-valeur stockée.
clé vrai chaîne
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()
}
Enregistrer la valeur de la clécount
dans l'environnement de fil en parallèle, puis lire la valeur clé decount
dans le fil principal.
{@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}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/
LesetData()
la fonction est utilisée pour stocker des variables dans le contexte du thread.
définitionDétails (clé, valeur)
Lekey
paramètre est utilisé pour spécifier le nom de clé de la paire clé-valeur stockée.
clé
vrai
chaîne
Levalue
paramètre est utilisé pour spécifier la valeur de clé de la paire clé-valeur stockée.
valeur vrai Tout type pris en charge par le système, tel que chaîne, nombre, bool, objet, tableau, fonction, valeur nulle, etc.
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Sleep(1000)
Log(`t1.getData("data"):`, t1.getData("data"))
t1.join()
}
Définissez la paire clé-valeur dans le thread concurrent et lisez la paire clé-valeur dans le thread principal.
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()
}
Il prend en charge le passage de la valeur de la clé dans les fonctions.
Les données sont valables lorsque le thread n'a pas exécuté lejoin()
fonction (en attente de sortie réussie) et n'a pas exécuté leterminate()
La valeur du paramètrevalue
doit être une variable sérialisable.
{@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/Threads/eventLoop eventLoop}
Leid()
fonction est utilisée pour retourner lethreadId
de l'instance d'objet multithread actuelle.
La valeur de rendement de laid()
la fonction estthreadId
.
Numéro
Nom de l'entreprise
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}
Créez un fil en cours d'exécution simultanée et sortez lethreadId
de ce fil parallèle dans le fil principal.
{@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 set}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Lename()
fonction est utilisée pour renvoyer le nom de l'instance d'objet multithreaded en cours.
Lename()
la fonction renvoie le nom du fil concurrent.
une chaîne
Nom (s)
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}
Créez un fil de discussion concurrent et sortez le nom du fil de discussion concurrent dans le fil principal.
{@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 set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/thread/eventLoop eventLoop}
LeeventLoop()
la fonction est utilisée pour écouter les événements reçus par le thread.
LeeventLoop()
fonction renvoie les informations d'événement reçues par le fil courant.Structure de l'information sur les événements.
objet, valeur nulle
événementLoop() événement Loop (délai de réponse)
Le paramètretimeout
est le temps d'arrêt en millisecondes.timeout
s'il est défini sur 0, il attend qu'un événement se produise avant de retourner. s'il est supérieur à 0, il définit le temps d'attente de l'événement. s'il est inférieur à 0, il renvoie immédiatement le dernier événement.
temps d'arrêt faux Numéro
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()
}
Exécuter trois threads simultanément et produire les informations d'événement reçues.
Le mécanisme de traitement deseventLoop()
est la même que la fonction globaleEventLoop()
.
{@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 set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/name name},
Objet de verrouillage de thread, utilisé pour le traitement de synchronisation multi-thread.
Leacquire()
la fonction est utilisée pour demander un verrouillage de fil.
acquérir
Veuillez vous référer authreading.Lock()
section pour les exemples.
Leacquire()
fonction est utilisée pour demander un verrouillage de thread.acquire()
fonction d'un objet de verrouillage de thread, il tente d'acquérir le verrouillage. Si le verrouillage n'est pas actuellement détenu par un autre thread, le thread appelant acquiert avec succès le verrouillage et continue l'exécution. Si le verrouillage est déjà détenu par un autre thread, le thread appelantacquire()
sera bloqué jusqu'à ce que le verrou soit relâché.
{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release} Je suis désolé.
Lerelease()
fonction est utilisée pour libérer un verrou de fil (déverrouiller).
libération
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()
}
Test de scénarios d'impasse
Il convient de noter que l'utilisation inappropriée de serrures à fil peut entraîner un blocage.
{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquérir acquérir}
Objet événement, utilisé pour la notification et le signal d'événement multi-threaded.
Leset()
La fonction est utilisée pour notifier les événements (signaux définis).
le groupe
Veuillez vous référer authreading.Event()
section pour les exemples.
Si le signal a été réglé en utilisantset()
Il faut nettoyer le signal et le réinitialiser.
{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Leclear()
fonction est utilisée pour effacer le signal.
C' est clair.
Veuillez vous référer authreading.Event()
section pour les exemples.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Lewait()
fonction est utilisée pour définir un événement (signal) d'attente, et va bloquer avant que l'événement (signal) est définie; il prend en charge la définition d'un paramètre de temps d'arrêt.
Lewait()
la fonction renvoie si le timeout s'est produit. Si oui, elle renvoie une valeur vraie.
Boole
Attends! Attends une minute.
Letimeout
Le paramètre est utilisé pour définir le temps d'attente en millisecondes.
temps d'arrêt faux Numéro
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()
}
Testez la valeur de retour duwait()
function.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}
LeisSet()
fonction est utilisée pour déterminer si un événement (signal) a été défini.
LeisSet()
la fonction renvoie si l'événement (signal) a été défini; si l'événement (signal) a été défini, elle renvoie une valeur vraie.
Boole
estSélectionné ((()
Veuillez vous référer authreading.Event()
section pour les exemples.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/Threads/ThreadEvent/wait wait}, {@fun/Threads/Threads/ThreadEvent/wait wait}, {@fun/Threads/Threads/ThreadEvent/wait wait}, {@fun/Threads/Threads/Threads/Wait wait}, {@fun/Threads/Threads/Wait wait wait}, {@fun/Threads/ThreadsEvent/wait wait wait}, {@fun/Threads/ThreadsEvent/Wait wait}, {@fun/Th
Objet de condition, utilisé pour la synchronisation multi-thread.
Lenotify()
fonction est utilisée pour réveiller un fil d'attente (le cas échéant).wait()
La méthode sera réveillée.
Il faut le signaler.
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)
}
}
Utilisez lenotify()
fonction pour réveiller le fil d'attente.
Lenotify()
fonction réveille un fil dans la file d'attente.
Lorsque lenotify()
fonction réveille un fil, le fil récupérera le verrou de fil.
{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquérir acquérir}, {@fun/Threads/ThreadCondition/release release}
LenotifyAll()
la fonction réveille tous les threads en attente.
Je vous préviens.
Veuillez vous référer auThreadCondition.notify()
section pour les exemples.
LenotifyAll()
fonction réveille tous les fils en attente un par un, et les fils réveillés reprennent le verrou de fil.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquérir acquérir}, {@fun/Threads/ThreadCondition/release release}
Lewait()
La fonction est utilisée pour faire attendre un fil dans certaines conditions de conception.
Attends!
Veuillez vous référer auThreadCondition.notify()
section pour les exemples.
Lewait()
La fonction relâche le verrouillage du fil et récupère le verrouillage du fil lorsqu'il est réveillé.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquérir acquérir}, {@fun/Threads/ThreadCondition/release release}
Leacquire()
la fonction est utilisée pour demander un verrouillage de fil.
acquérir
Veuillez vous référer auThreadCondition.notify()
section pour les exemples.
Avant utilisationwait()
, vous devez demander le verrouillage de thread (verrouillage) de l'objet condition actuel.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}
Lerelease()
fonction est utilisée pour libérer un verrou de fil (déverrouiller).
libération
Veuillez vous référer auThreadCondition.notify()
section pour les exemples.
Après utilisationwait()
, nous avons besoin de libérer le verrouillage de fil (déverrouiller) de l'objet condition actuelle.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquérir acquérir}
Objet de dictionnaire, utilisé pour le partage de données.
Leget()
fonction est utilisée pour obtenir la valeur de clé enregistrée dans l'objet du dictionnaire.
Leget()
Retourne la valeur de la clé spécifiée par lekey
parameter.
chaîne, nombre, bool, objet, tableau, valeur nulle et autres types pris en charge par le système
Je vais vous donner une clé.
Lekey
Le paramètre est utilisé pour spécifier le nom de la clé correspondant à la clé à obtenir.
clé vrai chaîne
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"))
}
Utiliser des objets événement pour notifier les threads pour lire et modifier les données.
{@fun/Threads/ThreadDict/set set} Je ne sais pas si vous êtes d'accord.
Leset()
La fonction est utilisée pour définir une paire clé-valeur.
définition (clés, valeurs)
Le paramètrekey
est utilisé pour définir le nom de la clé à modifier.
clé
vrai
chaîne
Le paramètrevalue
est utilisé pour définir la valeur clé à modifier.
valeur vrai chaîne, nombre, bool, objet, tableau, fonction, valeur nulle et autres types pris en charge par le système
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()
}
Il prend en charge le passage de la valeur de la clé dans les fonctions.
Je ne sais pas.
Réglages réseau Le Web3