Позволяет программе-политике действительно выполнять параллельно, добавляя поддержку многопотоков в базовом слое системы для политики JavaScript

Автор:Маленькие мечты, Создано: 2023-03-02 14:19:15, Обновлено: 2024-03-20 15:06:41

img

Позволяет программе-политике действительно выполнять параллельно, добавляя поддержку многопотоков в базовом слое системы для политики JavaScript

При разработке стратегии на FMZ с использованием языка JavaScript, поскольку архитектура стратегии является обоснованной.exchange.GoФункции выполняют одновременные вызовы некоторых интерфейсов, что позволяет реализовать некоторые потребности одновременных сценариев. Но это невозможно, если вы хотите создать действительно отдельную нить для выполнения ряда операций, например, как в языке Python.threadingВ этом году мы решили сделать несколько параллельных проектов.

Основываясь на этих потребностях, платформа FMZ модернизировала базовую систему. Также была добавлена поддержка для языка JavaScript.

  • Создание потоков и одновременное выполнение настраиваемых функций.
  • С другой стороны, мы не знаем, как это сделать.
  • Переменные, хранящиеся между разделяемыми потоками.
  • Ожидание выполнения потока завершает восстановление ресурсов и возвращает результаты выполнения.
  • Навязчивый выход из строя и утилизация ресурсов.
  • Получить ID текущего потока в одновременной функции выполнения потока.

Следующая статья поможет вам понять каждую функцию.

Создание последовательности для выполнения настройки функций

__ThreadФункции могут создавать одну нить и одновременно выполнять одну функцию. Например, нужно создать одновременную функцию.func1func1Что делает функция? Мы можем заставить ее добавить от 0 до 9, чтобы увидеть этот постепенный процесс добавления, используя цикл for для каждой паузы в функции func1 (функция Sleep используется для покоя в определенные миллисекунды).

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

В практическом случае мы можем выполнять одновременные HTTP-запросы:

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

Ожидание выполнения потока для завершения восстановления ресурсов и возвращения результатов выполнения

В этом примере мы использовали в конечном итоге функцию main.__threadJoinФункции, которые ждут завершения выполнения параллельных строк, переменныеretПрием__threadJoinВозвращаемое значение функции, которое мы распечатали, можно наблюдать как конкретный результат выполнения этой параллельной строки.

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

Навязчивый выход из строя и утилизация ресурсов

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
}

Или, как мы только что видели, после создания потока можно принудительно прекратить его выполнение после ожидания 1 секунды.

Связь между нитями

Основное использование для межпроводной связи__threadPostMessageФункции и__threadPeekMessageФункция. Давайте посмотрим на следующий простой пример:

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

__threadPostMessageФункции используются для отправки сообщений в какую-либо нить, первый параметр - это ID конкретной нитки, к которой отправляется сообщение, второй параметр - это сообщение, которое отправляется, и может быть строкой, числовым значением, диаграммой, объектом JSON и т. д.

__threadPeekMessageФункция используется для прослушивания сообщений, отправленных по определенной нише, может устанавливать отсрочку (миллисекунды) или может быть установлена на 0 для блокировки, чтобы прослушивать до тех пор, пока сообщение не вернется.

Конечно, кроме связи между параллельными и основными проводами, между параллельными проводами также может быть прямая связь.

Получить ID текущего потока в одновременном выполнении

В этом примере мы использовалиvar id = __threadId()__threadId()Функция может получить ID текущего потока.

Переменные, хранящиеся между разделенными потоками

В дополнение к коммуникации между нитками, можно взаимодействовать с помощью общих переменных.

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

Это просто демонстрация всех функций.


Связанные

Больше

Костяные ножиРекомендации по выполнению этой политики: Error ReferenceError: '__Thread' is not defined at main (__FILE__:5)

Костяные ножиСбор и обучение

Изобретатель количественныйУлучшение хранителя