En la carga de los recursos... Cargando...

Los demás

La plataforma de negociación de FMZ Quant realmente admite la función de múltiples hilos de laJavaScriptLa 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, releaseSe 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, isSetSe 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, releaseSe 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, setSe pueden pasar al entorno de hilo como parámetros de la función de ejecución de hilo.

el hilo

ElthreadingObject 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.threadingEste objeto sólo es compatible con elJavaScriptestrategia lingüística.

El hilo

ElThread()La función se utiliza para crear hilos concurrentes.

ElThread()La función devuelve aThreadobjeto, que se utiliza para gestionar los hilos creados simultáneamente, la comunicación de hilos, etc.

Threadobjetos

El hilo ((func,...args) Enlace (... elementos)

El parámetrofunces una función para ejecución simultánea (pasada por referencia), y admite el paso de funciones anónimas.funcpuede aceptar múltiples parámetros, que se transmitirán a través de...argsPor lo tanto, la lista de parámetros defuncdebe ser coherente con...args.

Función verdadero Función El parámetroarges 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 defuncdebe 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ámetroitemes una matriz que contiene las referencias de las funciones y sus parámetros a ejecutar simultáneamente.itemLos 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 hilofuncPasado 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}

Obtener el hilo

ElgetThread()La función se utiliza para obtener el objeto de hilo basado en el ID de hilo especificado.

ElgetThread()Función devuelve elThreadObjeto con el threadId especificado por el parámetro

Threadobjetos

¿Qué es esto?

El parámetrothreadIdObtener 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}

Enlace principal

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.

Threadobjetos

El tema principal es:

function main() {
    Log("The threadId of the main thread:", threading.mainThread().id())
}

Toma elThreadobjeto del hilo principal y la salida delthreadIddel 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}

El hilo actual

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.

Threadobjetos

El hilo actual (((

function test() {
    Log("Id of the current thread:", threading.currentThread().id())
}

function main() {
    var t1 = threading.Thread(test)
    t1.join()
}

Toma elThreadobjeto del hilo de corriente y la salida de lathreadIddel 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}

Encierra

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.

ThreadLockobjetos

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}

Condición

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.

ThreadConditionobjetos

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}

Evento

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.

ThreadEventobjetos

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}

Dictado

ElDict()La función se utiliza para crear un objeto de diccionario para pasar a hilos concurrentes.

ElDict()La función devuelve aThreadDict object.

ThreadDictobjetos

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

En espera

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

El hilo

Threadobjetos pueden ser creados o devueltos porthreading.Thread(), threading.getThread(), threading.mainThread(), ythreading.currentThread().

PeekMensaje

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ámetrotimeoutes 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. Sitimeoutse establece en 0 o eltimeoutsi el parámetro no se pasa, significa que el proceso bloqueará y esperará hasta que se reciban los datos del canal.timeoutSi 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}, {@

Envío de mensaje

ElpostMessage()función se utiliza para enviar un mensaje a un hilo.

El mensaje es:

El parámetromsges 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 thread llama a lapostMessage()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}

¿ Qué pasa?

Eljoin()Función utilizada para esperar a que el hilo salga y reclame recursos del sistema.

ElThreadRetobjetoscontiene datos sobre el resultado de la ejecución.

  • Identificación del hilo.
  • terminado: Si el hilo se ve obligado a terminar.
  • transcurrido: tiempo de funcionamiento del hilo en nanosegundos.
  • ret: el valor de retorno de la función de hilo.

ThreadRetobjetos

¿Qué quieres decir? Unirse (tiempo muerto)

EltimeoutParámetro se utiliza para establecer el tiempo de espera en milisegundos para esperar a que el hilo para terminar.timeoutel parámetro se establece en 0 o eltimeoutel parámetro no está establecido, eljoin()función bloqueará y esperar hasta que el hilo termine de ejecutar.timeoutel 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}

terminado

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}

Obtener Datos

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 lakeyPará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?

ElkeyPará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 clavecounten el entorno de hilo concurrente, y luego leer el valor clave decounten 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}

el conjunto de datos

ElsetData()La función se utiliza para almacenar variables en el contexto del hilo.

el conjunto de datos (clave, valor)

ElkeyEl parámetro se utiliza para especificar el nombre de la clave del par clave-valor almacenado.

llave verdadero la cuerda ElvalueEl 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ámetrovaluedebe 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}

el número de

Elid()función se utiliza para devolver elthreadIdde 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 lathreadIdde 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}

nombre

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}

Loop de evento

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ámetrotimeoutes la configuración de tiempo de espera en milisegundos.timeoutSi 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}

Enlace de hilo

Objeto de bloqueo de hilo, utilizado para el procesamiento de sincronización de múltiples hilos.

obtener

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?

liberación

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?

Enlace Evento

Objeto de evento, utilizado para notificaciones y señales de eventos de múltiples hilos.

conjunto

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}

Está claro.

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}

Espere un momento.

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)

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

esSet

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}

ThreadCondition (Condición del hilo)

Objeto de condición, utilizado para la sincronización de múltiples hilos.

- No lo sé.

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}

Notificar a todos

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}

Espere un momento.

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}

obtener

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}

liberación

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/

ThreadDict es el nombre de la serie

Objeto de diccionario, utilizado para compartir datos.

¿ Qué pasa?

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

ElkeyEl 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?

conjunto

Elset()La función se utiliza para establecer un par de valores clave.

el conjunto (clave, valor)

El parámetrokeyse utiliza para establecer el nombre de clave que se modificará.

llave verdadero la cuerda El parámetrovalueSe 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