Para que las políticas se ejecuten realmente en paralelo, añade soporte de múltiples hilos a las políticas de JavaScript en el fondo del sistema.

El autor:Un sueño pequeño., Creado: 2023-03-02 14:19:15, Actualizado: 2024-03-20 15:06:41

img

Para que las políticas se ejecuten realmente en paralelo, añade soporte de múltiples hilos a las políticas de JavaScript en el fondo del sistema.

Cuando se desarrollan políticas en FMZ usando el lenguaje JavaScript, la arquitectura de las políticas es consultada.exchange.GoLas funciones para realizar llamadas simultáneas de algunas interfaces, lo que satisface las necesidades de algunas situaciones simultáneas. Sin embargo, no es posible si se desea crear realmente un hilo por separado para ejecutar una serie de operaciones, por ejemplo, como en el lenguaje Python.threadingEn la actualidad, la mayoría de los proyectos están siendo desarrollados en el país.

Basado en esta necesidad, la plataforma FMZ ha actualizado la base del sistema. También se ha añadido un verdadero soporte multi-threaded para el lenguaje JavaScript.

  • Crear hilos para ejecutar funciones personalizadas simultáneamente.
  • La comunicación entre hilos.
  • Variables almacenadas entre hilos compartidos.
  • Esperar a que el ejecutivo termine el recurso de recuperación y regrese el resultado de la ejecución.
  • El gobierno de los EE.UU. está obligado a cerrar los ficheros y a reciclar los recursos.
  • Obtener el ID del hilo actual en una función de ejecución de hilo en paralelo.

El siguiente artículo te llevará a entender cada una de las funciones.

Creación de funciones personalizadas para ejecutar hilos simultáneamente

__ThreadUna función puede crear un hilo y ejecutar una función simultáneamente. Por ejemplo, se necesita crear una función simultánea.func1func1¿Qué hace la función? Podemos hacer que aumente de 0 a 9, para ver este proceso de incremento gradual, en la función func1 usamos el ciclo for para cada pausa (la función Sleep se usa para descansar un cierto número de milisegundos) de 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 el escenario de aplicación real, podemos hacer peticiones HTTP simultáneamente de esta manera:

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

Esperar a que el ejecutivo termine el recurso de recuperación y devuelva los resultados de ejecución

En el ejemplo anterior, la última vez que lo hicimos fue en la función principal.__threadJoinFunción para esperar a que se complete la ejecución de un hilo en paralelo, variableretRecepción__threadJoinEl valor de retorno de la función, que imprimimos, puede observarse como resultado específico de la ejecución de este hilo simultáneo.

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

El fin forzado de los hilos y el reciclaje de 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
}

O, como en el ejemplo anterior, después de crear un hilo, puede forzar la terminación del mismo después de esperar 1 segundo.

Comunicación entre hilos

Principales usos de las comunicaciones entre hilos__threadPostMessageFunción y__threadPeekMessageFunción. Veamos el siguiente ejemplo simple:

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

__threadPostMessageLas funciones se utilizan para enviar mensajes a un hilo, el primer parámetro es el ID del hilo al que se envía específicamente, el segundo parámetro es el mensaje enviado, que puede ser una cadena, un valor numérico, una matriz, un objeto JSON, etc. Se puede enviar mensajes al hilo principal en funciones de hilo paralelo, el ID del hilo principal se define como 0.

__threadPeekMessageLas funciones se utilizan para escuchar los mensajes enviados por un hilo, se puede configurar el tiempo de espera (millisecondes) o se puede configurar como 0 para bloquear, y se puede seguir escuchando hasta que se devuelva un mensaje.

Por supuesto, además de la comunicación entre los hilos paralelos y los principales hilos, también se puede comunicar directamente entre los hilos paralelos.

Obtener el ID del hilo actual en ejecuciones de hilos simultáneas

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

Variables almacenadas entre hilos compartidos

Además de la comunicación entre hilos, también se puede interactuar con variables compartidas.

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

Esta es una breve demostración de todas las funciones.


Relacionados

Más.

Cuchillo de huesoCopia esta política para ejecutar el consejo: Error ReferenceError: '__Thread' no está definido en principal (__FILE__:5)

Cuchillo de huesoColeccionando y aprendiendo

El inventor de la cuantificaciónLa actualización de los administradores