avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Permite que los programas de políticas se ejecuten realmente de manera simultánea y agrega compatibilidad con subprocesos múltiples a nivel de sistema a las políticas de JavaScript.

Creado el: 2023-03-02 14:19:15, Actualizado el: 2024-03-20 15:06:41
comments   3
hits   2081

Permite que los programas de políticas se ejecuten realmente de manera simultánea y agrega compatibilidad con subprocesos múltiples a nivel de sistema a las políticas de JavaScript.

Permite que los programas de políticas se ejecuten realmente de manera simultánea y agrega compatibilidad con subprocesos múltiples a nivel de sistema a las políticas de JavaScript.

Al desarrollar estrategias en FMZ usando JavaScript, la arquitectura de la estrategia es el sondeo. Si existe un escenario de diseño concurrente, esexchange.GoLas funciones se utilizan para realizar llamadas simultáneas a algunas interfaces, satisfaciendo así las necesidades de algunos escenarios concurrentes. Sin embargo, si desea crear un hilo independiente para realizar una serie de operaciones, no es posible. Por ejemplo, como en Python, utilicethreadingLa biblioteca se utiliza para realizar algunos diseños concurrentes.

En base a esta demanda, la plataforma FMZ actualizó el sistema subyacente. También se ha añadido al lenguaje JavaScript soporte multi-threading real. Las características detalladas incluyen:

  • Crear subprocesos para ejecutar simultáneamente funciones personalizadas.
  • Comunicación entre subprocesos.
  • Compartir variables almacenadas entre subprocesos.
  • Espere a que el hilo termine de ejecutarse, recupere recursos y devuelva el resultado de la ejecución.
  • Fuerza al hilo a terminar y recuperar recursos.
  • Obtener el ID del hilo actual en una función de ejecución de hilo concurrente.

A continuación, el editor te llevará a comprender cada función una por una.

Crear subprocesos para ejecutar simultáneamente funciones personalizadas

__ThreadUna función puede crear un hilo para ejecutar una función simultáneamente. Por ejemplo, necesitas crear una función concurrentefunc1func1¿Qué hace la función? Podemos dejar que se acumule de 0 a 9. Para ver este proceso de acumulación gradual, use un bucle for en la función func1 para pausar cada vez (la función Sleep se usa para dormir durante una cierta cantidad de milisegundos) durante un período determinado. del tiempo.

function func1(sleepMilliseconds) {
    var sum = 0 
    for (var i = 0 ; i < 10 ; i++) {
        sum += i 
        Sleep(sleepMilliseconds)
        Log("sum:", sum)
    }
    
    return sum
}

function main() {
    // 使用__Thread函数并发创建一个线程,参数200即为func1函数的参数,
    // 如果func1函数有多个参数,这里就具体传对应的参数
    var thread1Id = __Thread(func1, 200)
    
    // 这里需要等待线程Id为thread1Id的线程执行结果,否则main函数执行完就直接释放所有线程
    var ret = __threadJoin(thread1Id)
    Log("ret:", ret)
}

En escenarios de aplicación reales, podemos realizar solicitudes http simultáneas como esta:

function main() {
    let threads = [
        "https://www.baidu.com",
        "https://www.163.com"
    ].map(function(url) {
        return __Thread(function(url) {
            Log("GET", url)
            return HttpQuery(url)
        }, url)
    })
    threads.forEach(function(tid) {
        Log(__threadJoin(tid))
    })
}

Espere a que el hilo termine de ejecutarse, recupere recursos y devuelva el resultado de la ejecución.

En el ejemplo anterior, finalmente lo usamos en la función principal.__threadJoinFunción para esperar a que los subprocesos simultáneos completen la ejecución, variablerettomar el control__threadJoinEl valor de retorno de la función. Imprimimos este valor de retorno y observamos los resultados específicos de la ejecución de este subproceso concurrente.

// id:线程ID,terminated:是否被强制停止,elapsed:耗时(纳秒),ret:线程执行函数的返回值
ret: {"id":1,"terminated":false,"elapsed":2004884301,"ret":45}

Forzar el final del hilo y reciclar recursos

function func1(sleepMilliseconds) {
    var sum = 0 
    for (var i = 0 ; i < 10 ; i++) {
        sum += i 
        Sleep(sleepMilliseconds)
        Log("sum:", sum)
    }
    
    return sum
}

function main() {
    var thread1Id = __Thread(func1, 200)
    Sleep(1000)
    retThreadTerminate = __threadTerminate(thread1Id)
    Log(retThreadTerminate)   // true
}

Tomando nuevamente el ejemplo anterior, después de crear el hilo, puedes forzar la ejecución del hilo a finalizar después de esperar 1 segundo.

Comunicación entre subprocesos

La comunicación entre subprocesos se utiliza principalmente__threadPostMessageFunciones y__threadPeekMessagefunción. Veamos el siguiente ejemplo sencillo:

function func1() {
    var id = __threadId()
    while (true) {
        var postMsg = "来自id:" + id + "的线程函数func1的消息"
        __threadPostMessage(0, postMsg)              // 发送消息到主线程
        var peekMsg = __threadPeekMessage()         // 接收来自其它线程的消息
        Log(peekMsg)
        Sleep(5000)
    }
}

function main() {
    var threadId = __Thread(func1)
    
    while (true) {
        var postMsg = "来自主线程的main函数的消息"
        __threadPostMessage(threadId, postMsg)
        var peekMsg = __threadPeekMessage()
        Log(peekMsg, "#FF0000")                     // #FF0000 , 设置日志为红色用于区分
        Sleep(5000)
    }
}

__threadPostMessageLa función se utiliza para enviar un mensaje a un hilo. El primer parámetro es el ID del hilo específico al que se envía el mensaje y el segundo parámetro es el mensaje que se va a enviar, que puede ser una cadena, un número, un matriz, un objeto JSON, etc. Puede enviar mensajes al hilo principal en una función de hilo concurrente. El ID del hilo principal se define como 0.

__threadPeekMessageLa función se utiliza para monitorear los mensajes enviados por un hilo. Puede establecer un tiempo de espera (en milisegundos) o establecerlo en 0 para bloquear el hilo y monitorearlo hasta que haya un mensaje antes de regresar.

Por supuesto, a excepción de los subprocesos simultáneos que se comunican con el subproceso principal. Los subprocesos simultáneos también pueden comunicarse directamente entre sí.

Obtener el ID del hilo actual en una función de ejecución de hilo concurrente

En el ejemplo anterior, utilizandovar id = __threadId()__threadId()La función puede obtener el ID del hilo actual.

Compartir variables almacenadas entre subprocesos

Además de la comunicación entre hilos, también puedes usar variables compartidas para la interacción.

function testFunc() {
    __threadSetData(0, "testFunc", 100)   // 储存在当前线程环境,键值对 testFunc : 100 
    Log("testFunc执行完毕")
}

function main() {
    // threadId为1 ,创建的threadId为1的线程会先执行完,只要线程资源没有被回收,线程本地储存的变量就有效
    var testThread = __Thread(testFunc)
    
    Sleep(1000)

    // 输出 in main, get testFunc: 100
    Log("in main, get testFunc:", __threadGetData(testThread, "testFunc"))   // 取出键名为testFunc的值
}

Lo anterior es una demostración simple de todas las funciones.