La plataforma de negociación de FMZ Quant realmente admite la función de múltiples hilos de laJavaScript
La estrategia de lenguaje desde abajo del sistema, y pone en práctica los siguientes objetivos:
Objetos | Direcciones | Las observaciones |
---|---|---|
el hilo | Objeto global con múltiples hilos | Funciones de los miembros:Thread , getThread , mainThread , etc. |
El hilo | Objeto de hilo | Funciones de los miembros:peekMessage , postMessage , join , etc. |
Enlace de hilo | Objeto de bloqueo de hilo | Funciones de los miembros:acquire , release Se pueden pasar al entorno de hilo como parámetros de la función de ejecución de hilo. |
Enlace Evento | Objeto de evento | Funciones de los miembros:set , clear , wait , isSet Se pueden pasar al entorno de hilo como un parámetro de la función de ejecución de hilo. |
ThreadCondition (Condición del hilo) | Objeto de condición | Funciones de los miembros:notify , notifyAll , wait , acquire , release Se pueden pasar al entorno de hilo como un parámetro de la función de ejecución de hilo. |
ThreadDict es el nombre de la serie | Objeto del diccionario | Funciones de los miembros:get , set Se pueden pasar al entorno de hilo como parámetros de la función de ejecución de hilo. |
Elthreading
Object es una herramienta global de gestión multithreading que proporciona funciones tales como la creación de hilos concurrentes, bloqueos de hilos y objetos de condición.threading
Este objeto sólo es compatible con elJavaScript
estrategia lingüística.
ElThread()
La función se utiliza para crear hilos concurrentes.
ElThread()
La función devuelve aThread
objeto, que se utiliza para gestionar los hilos creados simultáneamente, la comunicación de hilos, etc.
Thread
objetos
El hilo ((func,...args) Enlace (... elementos)
El parámetrofunc
es una función para ejecución simultánea (pasada por referencia), y admite el paso de funciones anónimas.func
puede aceptar múltiples parámetros, que se transmitirán a través de...args
Por lo tanto, la lista de parámetros defunc
debe ser coherente con...args
.
Función
verdadero
Función
El parámetroarg
es el parámetro real pasado afunc
(es decir, la función de ejecución de hilo concurrente) cuando se ejecuta la devolución de llamada; puede haber múltiples parámetrosarg
, y la lista de parámetros defunc
debe ser coherente con...args
.
el
falsos
cadena, número, bool, objeto, matriz, función, valor nulo y otros tipos compatibles con el sistema
El parámetroitem
es una matriz que contiene las referencias de las funciones y sus parámetros a ejecutar simultáneamente.item
Los parámetros se pueden pasar cuando se llama elThread
function.
el artículo verdadero el conjunto
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()
}
Crear hilos concurrentes tanto para una función personalizada como para una función anónima.
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()
}
Utilice elThread(...items)
forma para crear hilos concurrentes y ejecutar múltiples funciones secuencialmente.
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()
}
Apoya el paso de parámetros a funciones ejecutadas simultáneamente.
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)
}
Soporta el paso de cadenas de funciones y puede importar bibliotecas externas dinámicamente para computación concurrente.
La función del hilofunc
Pasado en elThread()
La función para ejecución simultánea se ejecuta en un entorno aislado, por lo que las variables fuera del hilo no se pueden referenciar directamente, y la compilación fallará cuando se hace referencia. Al mismo tiempo, no se admiten referencias a otras funciones de cierre dentro del hilo. Todas las API proporcionadas por la plataforma se pueden llamar dentro del hilo, pero no se pueden llamar otras funciones definidas por el usuario.
Todas las funciones relacionadas con los hilos concurrentes solo se admiten como compatibilidad de código en el sistema de backtesting y no se ejecutarán realmente por hilos concurrentes, por lo que no se repetirán en este capítulo.
{@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}, {@fun/Threads/threading/eventLoop}
ElgetThread()
La función se utiliza para obtener el objeto de hilo basado en el ID de hilo especificado.
ElgetThread()
Función devuelve elThread
Objeto con el threadId especificado por el parámetro
Thread
objetos
¿Qué es esto?
El parámetrothreadId
Obtener el objeto de hilo correspondiente especificando el parámetro.
Enlace verdadero Número
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())
}
Obtener el objeto de hilo especificado a travésthreadId
.
Apoya el sistema de backtesting y el entorno comercial en vivo.
Si el hilo que desea obtener ha sido ejecutado y liberado, no puede utilizarthreading.getThread(threadId)
para obtener el objeto del hilo del hilo.
{@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/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
ElmainThread()
La función se utiliza para obtener el objeto del hilo del hilo principal, es decir, el hilo donde elmain()
la función en la estrategia se encuentra.
ElmainThread()
función devuelve el objeto de hilo del hilo principal.
Thread
objetos
El tema principal es:
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
Toma elThread
objeto del hilo principal y la salida delthreadId
del hilo principal.
function test() {
Log("Output the main thread ID in the test function:", threading.mainThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
El objeto de hilo del hilo principal también se puede obtener en hilos concurrentes.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
ElcurrentThread()
La función se utiliza para obtener el objeto de hilo del hilo actual.
ElcurrentThread()
función devuelve el objeto de hilo del hilo actual.
Thread
objetos
El hilo actual (((
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Toma elThread
objeto del hilo de corriente y la salida de lathreadId
del hilo actual.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop eventLoop}, {@fun/Threads/threading/eventLoop}
ElLock()
La función se utiliza para crear un objeto de bloqueo de hilo.
ElLock()
La función devuelve un objeto de bloqueo de hilo.
ThreadLock
objetos
Encierra.
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()
}
Dos hilos concurrentes acceden a un recurso común.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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/threading/event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop event Loop}, {@fun/Threads/threads/threads/eventLoop}
ElCondition()
La función se utiliza para crear un objeto variable de condición, que se utiliza para lograr la sincronización y la comunicación entre los hilos en un entorno concurrente de múltiples hilos.Condition()
, un hilo puede esperar cuando ciertas condiciones no se cumplen hasta que otro hilo le notifique que la condición se ha cumplido.
ElCondition()
La función devuelve aThreadCondition
object.
ThreadCondition
objetos
Condición
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()
}
Dos hilos concurrentes acceden a un recurso común.
El sistema de backtesting no implementa esta funcionalidad, sólo la define.
{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
ElEvent()
función se utiliza para crear unevento de hiloobjeto, que se utiliza para la sincronización entre los hilos, permitiendo que un hilo espere la notificación o la señal de otro hilo.
ElEvent()
La función devuelve aThreadEvent
object.
ThreadEvent
objetos
Evento ())
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()
}
Dos hilos concurrentes acceden a un recurso común.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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/Thread Thread}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop event Loop}
ElDict()
La función se utiliza para crear un objeto de diccionario para pasar a hilos concurrentes.
ElDict()
La función devuelve aThreadDict
object.
ThreadDict
objetos
Dict ((()
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()
}
Pasar un objeto normal a la función de ejecución de hilo concurrente para probar si modificar el valor de clave del objeto causará cambios en el valor de clave del objeto en otros hilos.
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()
}
Pasa elThreadDict
objeto creado por elDict()
función a la función de ejecución de hilo concurrente, y probar si modificar el valor de la clave del objeto hará que el valor de la clave del objeto en otros hilos cambie.
Cuando un objeto común se pasa a una función de hilo concurrente, se pasa como una copia profunda.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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/Thread Thread}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}
Elpending
La función se utiliza para obtener el número de hilos concurrentes que se ejecutan en el programa de estrategia actual.
Elpending()
función devuelve el número de hilos concurrentes que el programa de estrategia actual está ejecutando.
Número
En trámite
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())
}
Crear dos hilos que se ejecutan simultáneamente y llamar elpending()
Funcionan en diferentes puntos de tiempo.
Cuando la estrategiamain()
función comienza a ejecutarse, llamando a la funciónpending()
directamente devolverá 1, porque el hilo principal donde la estrategiamain()
La función está localizada es también un hilo pendiente.
Apoya el sistema de backtesting y el entorno comercial en vivo.
{@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
objetos pueden ser creados o devueltos porthreading.Thread()
, threading.getThread()
, threading.mainThread()
, ythreading.currentThread()
.
ElpeekMessage()
La función se utiliza para obtener un mensaje de un hilo.
ElpeekMessage()
función devuelve el mensaje recibido por el hilo asociado con el objeto de hilo actual.
cadena, número, bool, objeto, matriz, valor nulo y otros tipos compatibles con el sistema
PeekMensaje (() PeekMessage ((tiempo muerto)
El parámetrotimeout
es la configuración de tiempo de espera. Bloqueará y esperará el número de milisegundos establecidos por el parámetro y devolverá los datos. Si no hay datos y el tiempo de espera excede el límite, se devolverá un valor nulo. Sitimeout
se establece en 0 o eltimeout
si el parámetro no se pasa, significa que el proceso bloqueará y esperará hasta que se reciban los datos del canal.timeout
Si se establece en -1, significa que el proceso no bloqueará y devolverá datos de inmediato.
tiempo de espera falsos Número
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()
}
Envía mensajes al hilo principal desde un hilo concurrente.
Al escribir programas, necesitamos prestar atención a los problemas de cierre de hilo.
{@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}, {@Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop}, {@
ElpostMessage()
función se utiliza para enviar un mensaje a un hilo.
El mensaje es:
El parámetromsg
es el mensaje que se enviará.
mensaje de texto verdadero Cualquier tipo compatible con el sistema, como cadena, número, bool, objeto, matriz, función, valor nulo, 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()
}
Enviar mensajes en hilos simultáneos y usareventLoop()
para recibir notificaciones de mensajes.
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()
}
Apoya el envío de una función.
Cuando una función de ejecución de threadpostMessage()
La función para enviar una señal o datos, un evento de mensaje también se genera.eventLoop()
Función para recibir notificaciones de mensajes.
{@fun/Threads/Thread/peekMessage peekMessage}, {@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/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
Eljoin()
Función utilizada para esperar a que el hilo salga y reclame recursos del sistema.
ElThreadRet
objetoscontiene datos sobre el resultado de la ejecución.
ThreadRet
objetos
¿Qué quieres decir? Unirse (tiempo muerto)
Eltimeout
Parámetro se utiliza para establecer el tiempo de espera en milisegundos para esperar a que el hilo para terminar.timeout
el parámetro se establece en 0 o eltimeout
el parámetro no está establecido, eljoin()
función bloqueará y esperar hasta que el hilo termine de ejecutar.timeout
el parámetro está establecido en -1, eljoin()
La función volverá inmediatamente.
tiempo de espera falsos Número
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}
}
Prueba eljoin()
Función de tiempo de espera y salida del valor de retorno.
Eljoin()
Tiempos de salida y retorno de la funciónundefined
.
{@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}
Elterminate()
La función se utiliza para terminar por la fuerza un hilo y liberar los recursos de hardware utilizados por el hilo creado.
Terminar el contrato
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)
}
}
Terminar la ejecución de un hilo con la fuerza Después de terminar un hilo con la fuerza, no habrá salida de este hilo en el registro.
Para los hilos que se terminan por la fuerza por elterminate()
La función, ya no podemos utilizar eljoin()
Función para esperar a que terminen.
{@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/Threads/Thread/eventLoop eventLoop}
ElgetData()
Los datos son válidos cuando el hilo no ha ejecutado eljoin()
Función (en espera de exit exit) y no ha ejecutado elterminate()
Función (terminando el hilo por la fuerza).
ElgetData()
Función devuelve el valor clave correspondiente a lakey
Parámetro en el par clave-valor almacenado en el contexto del hilo actual.
cadena, número, bool, objeto, matriz, valor nulo y otros tipos compatibles con el sistema
- ¿Qué quieres decir? - ¿ Qué pasa?
Elkey
Parámetro es el nombre de la clave del par clave-valor almacenado.
llave verdadero la cuerda
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()
}
Registre el valor de la clavecount
en el entorno de hilo concurrente, y luego leer el valor clave decount
en el hilo 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 name}, {@fun/Threads/Thread/eventLoop eventLoop}
ElsetData()
La función se utiliza para almacenar variables en el contexto del hilo.
el conjunto de datos (clave, valor)
Elkey
El parámetro se utiliza para especificar el nombre de la clave del par clave-valor almacenado.
llave
verdadero
la cuerda
Elvalue
El parámetro se utiliza para especificar el valor de clave del par clave-valor almacenado.
Valor verdadero Cualquier tipo compatible con el sistema, como cadena, número, bool, objeto, matriz, función, valor nulo, etc.
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Sleep(1000)
Log(`t1.getData("data"):`, t1.getData("data"))
t1.join()
}
Establezca el par clave-valor en el hilo concurrente y lea el par clave-valor en el hilo 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()
}
Apoya la transmisión de valores clave a funciones.
Los datos son válidos cuando el hilo no ha ejecutado eljoin()
Función (en espera de exit exit) y no ha ejecutado elterminate()
El valor del parámetrovalue
debe ser una variable serializable.
{@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}
Elid()
función se utiliza para devolver elthreadId
de la instancia actual de objeto multithreaded.
El valor de retorno de laid()
la función esthreadId
.
Número
el número de identificación
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}
Crear un hilo de ejecución simultánea y la salida de lathreadId
de este hilo concurrente en el hilo 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}
Elname()
función se utiliza para devolver el nombre de la instancia de objeto multithreaded actual.
Elname()
función devuelve el nombre del hilo concurrente.
la cuerda
nombre ())
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}
Crea un hilo concurrente y saca el nombre del hilo concurrente en el hilo 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/eventLoop eventLoop}
EleventLoop()
La función se utiliza para escuchar los eventos recibidos por el hilo.
EleventLoop()
función devuelve la información del evento recibido por el hilo actual.Estructura de la información del evento.
Objeto, valor cero
Loop de acontecimientos EventLoop (tiempo muerto)
El parámetrotimeout
es la configuración de tiempo de espera en milisegundos.timeout
Si el valor de un evento es igual a 0, esperará a que ocurra un evento antes de regresar. Si es mayor que 0, establecerá el tiempo de espera del evento. Si es menor que 0, devolverá el evento más reciente inmediatamente.
tiempo de espera falsos Número
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()
}
Ejecute tres hilos simultáneamente y saque la información del evento recibida.
El mecanismo de procesamiento de loseventLoop()
la función es la misma que la función globalEventLoop()
.
{@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}
Objeto de bloqueo de hilo, utilizado para el procesamiento de sincronización de múltiples hilos.
Elacquire()
La función se utiliza para solicitar un bloqueo de hilo (bloqueo).
¿Qué es esto?
Por favor, consulte elthreading.Lock()
Sección para ejemplos.
Elacquire()
Cuando un hilo llama elacquire()
Si el bloqueo no está actualmente sostenido por otro hilo, el hilo que llama adquiere el bloqueo con éxito y continúa la ejecución. Si el bloqueo ya está sostenido por otro hilo, el hilo que llamaacquire()
Se bloqueará hasta que el candado sea liberado.
¿Qué es lo que está pasando?
Elrelease()
Función utilizada para liberar un bloqueo de hilo (desbloqueo).
liberación
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()
}
Prueba de escenarios de punto muerto
Debe tenerse en cuenta que el uso inadecuado de las cerraduras de hilo puede provocar un estancamiento.
¿Por qué no lo haces?
Objeto de evento, utilizado para notificaciones y señales de eventos de múltiples hilos.
Elset()
La función se utiliza para notificar eventos (señales de conjunto).
el conjunto (()
Por favor, consulte elthreading.Event()
Sección para ejemplos.
Si la señal se ha configurado utilizandoset()
Necesitamos limpiar la señal y volver a establecerla.
{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Elclear()
La función se utiliza para eliminar la señal.
Está claro.
Por favor, consulte elthreading.Event()
Sección para ejemplos.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Elwait()
función se utiliza para establecer un evento (señal) espera, y bloqueará antes de que el evento (señal) se establece; admite el establecimiento de un parámetro de tiempo de espera.
Elwait()
La función devuelve si el tiempo de espera ha ocurrido. Si es así, devuelve un valor verdadero.
Bool también
Espera un poco. Espera (tiempo muerto)
Eltimeout
El parámetro se utiliza para establecer el tiempo de espera en milisegundos.
tiempo de espera falsos Número
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()
}
Prueba el valor de retorno delwait()
function.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}
ElisSet()
La función se utiliza para determinar si se ha establecido un evento (señal).
ElisSet()
La función devuelve si el evento (señal) se ha establecido; si el evento (señal) se ha establecido, devuelve un valor verdadero.
Bool también
EsSET (()
Por favor, consulte elthreading.Event()
Sección para ejemplos.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}
Objeto de condición, utilizado para la sincronización de múltiples hilos.
Elnotify()
La función se utiliza para despertar un hilo en espera (si lo hay).wait()
El método se despertará.
Se lo notificará.
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)
}
}
Utilice elnotify()
Función para despertar el hilo de espera.
Elnotify()
función despierta un hilo en la cola de espera.
Cuando elnotify()
Función despierta un hilo, el hilo recuperará el bloqueo del hilo.
{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
ElnotifyAll()
La función despierta todos los hilos en espera.
Notificar a todos
Por favor, consulte elThreadCondition.notify()
Sección para ejemplos.
ElnotifyAll()
función despierta todos los hilos en espera uno por uno, y los hilos despertados recuperar el cierre de hilo.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Elwait()
Función utilizada para hacer que un hilo espere bajo ciertas condiciones diseñadas.
Espera un poco.
Por favor, consulte elThreadCondition.notify()
Sección para ejemplos.
Elwait()
La función libera el bloqueo del hilo y recupera el bloqueo del hilo cuando se despierta.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Elacquire()
La función se utiliza para solicitar un bloqueo de hilo (bloqueo).
¿Qué es esto?
Por favor, consulte elThreadCondition.notify()
Sección para ejemplos.
Antes de su usowait()
, es necesario solicitar el cierre de hilo (bloqueo) del objeto de condición actual.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}, {@fun/ThreadCondition/ThreadCondition/release release}, {@fun/ThreadCondition/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/ThreadCondition/ThreadCondition/release release}, {@fun/ThreadCondition/thread release}, {@fun/ThreadCondition/threadCondition/release release}
Elrelease()
Función utilizada para liberar un bloqueo de hilo (desbloqueo).
liberación
Por favor, consulte elThreadCondition.notify()
Sección para ejemplos.
Después de usowait()
, necesitamos liberar el cierre de hilo (desbloqueo) del objeto de condición actual.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/ThreadCondition/ThreadCondition/acquire}, {@fun/ThreadCondition/ThreadCondition/acquire}, {@fun/Threads/ThreadCondition/acquire}, {@fun/ThreadCondition/ThreadCondition/acquire}, {@fun/ThreadCondition/ThreadCondition/acquire}, {@fun/ThreadCondition/acquire}, {@fun/ThreadCondition/acquire}, {@fun/ThreadCondition/acquire}, {@fun/threadCondition/threadCondition/acquire}, {@fun/
Objeto de diccionario, utilizado para compartir datos.
Elget()
La función se utiliza para obtener el valor clave registrado en el objeto del diccionario.
Elget()
función devuelve el valor de la clave especificada por elkey
parameter.
cadena, número, bool, objeto, matriz, valor nulo y otros tipos compatibles con el sistema
Obtener la llave
Elkey
El parámetro se utiliza para especificar el nombre de la clave correspondiente a la clave a obtener.
llave verdadero la cuerda
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"))
}
Utilice objetos de eventos para notificar a los hilos para leer y modificar datos.
¿Por qué no lo haces?
Elset()
La función se utiliza para establecer un par de valores clave.
el conjunto (clave, valor)
El parámetrokey
se utiliza para establecer el nombre de clave que se modificará.
llave
verdadero
la cuerda
El parámetrovalue
Se utiliza para establecer el valor clave que se modifica.
Valor verdadero cadena, número, bool, objeto, matriz, función, valor nulo y otros tipos compatibles con el sistema
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()
}
Apoya la transmisión de valores clave a funciones.
# # # # # # # # # # # # # # # # # # # # #
Configuración de la red Web3