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

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

Configuración de la red El hilo