В процессе загрузки ресурсов... загрузка...

Нитки

FMZ Quant Trading Platform действительно поддерживает многопоточную функциюJavaScriptязыковой стратегии с нижней части системы и реализует следующие цели:

Объекты Руководство Примечания
прокрутка Многопоточный глобальный объект Функции членов:Thread, getThread, mainThread, и т.д.
Нить Объект нитки Функции членов:peekMessage, postMessage, join, и т.д.
Закрыть Объект блокировки нитей Функции членов:acquire, releaseОни могут быть переданы в среду потока в качестве параметров функции выполнения потока.
Ведущий Объект события Функции членов:set, clear, wait, isSetОни могут быть переданы в среду потока в качестве параметра функции выполнения потока.
ThreadCondition (Условие) Объект условия Функции членов:notify, notifyAll, wait, acquire, releaseОни могут быть переданы в среду потока в качестве параметра функции выполнения потока.
ThreadDict Объект словаря Функции членов:get, setОни могут быть переданы в среду потока в качестве параметров функции выполнения потока.

прокрутка

Вthreadingobject - это глобальный инструмент управления многопотоками, который предоставляет такие функции, как создание одновременных потоков, блокировки потоков и объекты условий.threadingЭтот объект поддерживается толькоJavaScriptязыковой стратегии.

Нить

ВThread()Функция используется для создания одновременных потоков.

ВThread()функция возвращает aThreadобъект, который используется для управления созданными параллельными потоками, коммуникацией потоков и т.д.

Threadобъект

Ведущий (забавный) Речь идет о... предметах.

Параметрfuncявляется функцией для одновременного выполнения (передается по ссылке) и поддерживает передачу анонимных функций.funcможет принимать несколько параметров, которые будут передаваться через...argsПоэтому список параметровfuncдолжна соответствовать...args.

Функция неправда Функция Параметрargявляется фактическим параметром, переданнымfunc(т.е. функция одновременного выполнения потока) при выполнении обратного вызова; может быть несколько параметровarg, и перечень параметровfuncдолжна соответствовать...args.

арг ложное string, number, bool, object, array, function, null value и другие типы, поддерживаемые системой Параметрitemпредставляет собой массив, содержащий ссылки на функции и их параметры, которые должны быть выполнены одновременно.itemпараметры могут быть переданы при вызовеThread function.

пункт неправда массив

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

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

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

ИспользуйтеThread(...items)Форма для создания одновременных потоков и выполнения нескольких функций последовательно.

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

Он поддерживает передачу параметров одновременно выполняемым функциям.

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

Он поддерживает передачу последовательностей функций и может импортировать внешние библиотеки динамически для одновременного вычисления.

Функция ниткиfuncпрошел вThread()Функция для одновременного выполнения выполняется в изолированной среде, поэтому переменные за пределами потока не могут быть напрямую ссылаются, и компиляция не удастся при ссылке. В то же время ссылки на другие функции закрытия не поддерживаются в потоке. Все API, предоставляемые платформой, могут быть вызваны в потоке, но другие функции, определенные пользователем, не могут быть вызваны.

Все параллельные функции, связанные с потоком, поддерживаются только как совместимость кода в системе параллельного тестирования и не будут фактически выполняться параллельными потоками, поэтому они не будут повторяться в этой главе.

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

getThread

ВgetThread()функция используется для получения объекта потока на основе указанного ID потока.

ВgetThread()функция возвращаетThreadОбъект с threadId, указанный параметром

Threadобъект

getThread ((ThreadId)

ПараметрthreadIdПолучить соответствующий объект потока, указав параметр.

Проводка неправда Номер

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

Получить указанный объект потока черезthreadId.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

Если вы хотите получить нить была выполнена и выпущена, вы не можете использоватьthreading.getThread(threadId)чтобы получить предмет нитки нитки.

{@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/threads/Dict Dict}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threading/eventLoop Loop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}

Главная нить

ВmainThread()Функция используется для получения объекта нитки основного нитки, то есть нитки, гдеmain()функция в стратегии расположена.

ВmainThread()Функция возвращает объект потока основного потока.

Threadобъект

ГлавныйThread ((()

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

ВозьмиThreadОбъект основной нити и выходthreadIdГлавной нитью.

function test() {
    Log("Output the main thread ID in the test function:", threading.mainThread().id())
}

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

Объект нитки основной нитки также может быть получен в одновременных нитках.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@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/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threading/eventLoop Loop}, {@fun/Threads/threads/threading/eventLoop}

текущая нить

ВcurrentThread()функция используется для получения объекта потока текущей потоки.

ВcurrentThread()функция возвращает объект потока текущей потоки.

Threadобъект

текущийThread ((()

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

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

ВозьмиThreadобъекта текущей нити и выходthreadIdтекущей нити.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@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/threading/Loop eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threads/event

Замок.

ВLock()Функция используется для создания объекта блокировки потока.

ВLock()Функция возвращает объект блокировки потока.

ThreadLockобъект

Замок ((()

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

Два параллельных потока получают доступ к общему ресурсу.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@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/threads/threading/Event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/threading/eventLoop}

Состояние

ВCondition()функция используется для создания объекта переменной условия, который используется для достижения синхронизации и связи между потоками в многопоточной параллельной среде.Condition(), нить может ждать, когда определенные условия не выполнены, пока другая нить не уведомит ее о том, что условие выполнено.

ВCondition()функция возвращает aThreadCondition object.

ThreadConditionобъект

Состояние

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

Два параллельных потока получают доступ к общему ресурсу.

Система обратного тестирования не реализует эту функциональность, она только определяет ее.

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

Событие

ВEvent()функция используется для созданиясобытие потокаобъект, который используется для синхронизации между потоками, позволяя одному потоку ждать уведомления или сигнала от другого потока.

ВEvent()функция возвращает aThreadEvent object.

ThreadEventобъект

Событие

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

Два параллельных потока получают доступ к общему ресурсу.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/getThread getThread}, {@fun/Threads/threads/mainThread mainThread}, {@fun/Threads/threads/currentThread currentThread}, {@fun/Threads/threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threads/threading/Thread Thread}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop}

Диктант

ВDict()Функция используется для создания объекта словаря для передачи на одновременные потоки.

ВDict()функция возвращает aThreadDict object.

ThreadDictобъект

Диктант

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

Передача нормального объекта на функцию выполнения параллельного потока, чтобы проверить, будет ли изменение значения ключа объекта вызывать изменения значения ключа объекта в других потоках.

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

ПередайThreadDictОбъект, созданныйDict()Функция выполняется одновременно с функцией выполнения потока, и проверяется, будет ли изменение значения ключа объекта приводить к изменению значения ключа объекта в других потоках.

При передаче общего объекта в функцию параллельного потока, он передается как глубокая копия.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

{@fun/Threads/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/threading/Thread Thread}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}

В ожидании

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

Вpending()функция возвращает количество одновременных потоков, которые запускает текущая стратегия программы.

Номер

В ожидании))

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

Создать два одновременно работающих потока и вызватьpending()Функция в разных временных узлах.

Когда стратегияmain()Функция начинает работать, вызывая функциюpending()непосредственно вернет 1, потому что основная нить, где стратегияmain()функция находится также в ожидании нить.

Он поддерживает систему обратного тестирования и среду торговли в реальном времени.

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

Нить

Threadобъекты могут быть созданы или возвращеныthreading.Thread(), threading.getThread(), threading.mainThread(), иthreading.currentThread().

PeekСообщение

ВpeekMessage()Функция используется для получения сообщения из потока.

ВpeekMessage()функция возвращает сообщение, полученное нитью, связанной с текущим объектом нитки.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

Посмотреть сообщение (() PeekMessage ((Timeout) Посмотреть сообщение

ПараметрtimeoutЕсли нет данных и время задержки превышает предел, будет возвращено значение NULL.timeoutустанавливается на 0 илиtimeoutпараметр не будет передан, это означает, что процесс будет блокировать и ждать, пока данные не будут получены из канала.timeoutЕсли значение -1, это означает, что процесс не будет блокировать и возвращать данные немедленно. Если нет данных, будет возвращено значение нуль.

Тайм-аут ложное Номер

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

Отправлять сообщения в главную нить из параллельной нитки.

Когда мы пишем программы, мы должны обращать внимание на проблемы с тупиком потоков.

{@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/Threads/Thread/name}, {@Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}

Послание

ВpostMessage()Функция используется для отправки сообщения в тему.

mailMessage(msg)

ПараметрmsgЭто послание, которое нужно отправить.

СМС Истинно Любой тип, поддерживаемый системой, например строка, число, bool, объект, массив, функция, нулевое значение и т. д.

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

Отправка сообщений в одновременных потоках и использованиеeventLoop()чтобы получать уведомления о сообщениях.

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

Он поддерживает отправку функции.

Когда функция выполнения threads вызываетpostMessage()Функция для отправки сигнала или данных, событие сообщения также генерируется.eventLoop()функция получения уведомлений о сообщениях.

{@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}, {@fun/Threads/Threads/Thread/name}, {@fun/Threads/Thread/eventLoop eventLoop}

присоединяться

Вjoin()функция используется для ожидания выхода потока и восстановления системных ресурсов.

ВThreadRetобъектсодержит данные о результате выполнения.

  • ID: ID нитки.
  • terminated: если нить вынуждена закончиться.
  • прошедшее время: время прохождения нитки в наносекундах.
  • ret: возвращаемое значение функции "thread".

ThreadRetобъект

Присоединяйтесь. Присоединяйтесь (Timeout)

ВtimeoutПараметр используется для установки временного пребывания в миллисекундах для ожидания окончания потока.timeoutпараметр установлен на 0 илиtimeoutпараметр не установлен,join()функция будет блокировать и ждать, пока нить закончит выполнение.timeoutпараметр установлен на -1,join()Функция восстановится немедленно.

Тайм-аут ложное Номер

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

Проверитьjoin()Функция timeout и вывод возвращаемого значения.

Вjoin()время выхода и возвращения функцииundefined.

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

прекратить

Вterminate()функция используется для принудительного прекращения потока и освобождения аппаратных ресурсов, используемых созданным потоком.

прекратить ((()

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

После принудительного прекращения действия потока не будет выхода из этого потока в журнале.

Для нитей, которые насильно заканчиваютсяterminate()Функция, мы больше не можем использоватьjoin()Функция ждать, пока они закончатся.

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

getData

ВgetData()Данные действительны, когда нить не выполняетjoin()Функция (в ожидании успешного выхода) и не выполнилаterminate()функцию (силовое прекращение нити).

ВgetData()Функция возвращает значение ключа, соответствующееkeyпараметр в паре ключей и значений, хранящийся в текущем контексте потока.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

getData ((() getData ((ключ)

Вkeyпараметр - это название ключа для сохраненной пары ключей и значений.

ключ неправда строка

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

Запишите значение ключаcountв одновременной среде нить, а затем читать ключевое значениеcountв главной нить.

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

setData

ВsetData()функция используется для хранения переменных в контексте потока.

setData ((ключ, значение)

Вkeyпараметр используется для указания названия ключа для сохраненной пары ключей и значений.

ключ неправда строка Вvalueпараметр используется для указания значения ключа для сохраненной пары ключей и значений.

стоимость Истинно Любой тип, поддерживаемый системой, например строка, число, bool, объект, массив, функция, нулевое значение и т. д.

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Sleep(1000)
    Log(`t1.getData("data"):`, t1.getData("data"))
    t1.join()
}

Установите пару ключей-значений в паре параллельных нитей и прочитайте пару ключей-значений в основной нитке.

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

Он поддерживает передачу ключевых значений в функции.

Данные действительны, когда нить не выполняетjoin()Функция (в ожидании успешного выхода) и не выполнилаterminate()значение параметраvalueдолжна быть сериализируемой переменной.

{@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/Thread/eventLoop eventLoop}

Идентификатор

Вid()Функция используется для возвращенияthreadIdтекущего многопоточного объекта.

Доходное значениеid()функция -threadId.

Номер

id()

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.id():`, t1.id())
    t1.join()
}

Создать параллельно работающий нить и вывестиthreadIdэтой параллельной нитью в основной нить.

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

Имя

Вname()функция используется для возвращения имени текущего многопоточного объекта.

Вname()Функция возвращает имя параллельной нитки.

строка

Имя ((()

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.name():`, t1.name())  // t1.name(): Thread-1
    t1.join()
}

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

{@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/Threads/Thread/eventLoop eventLoop}

событиеLoop

ВeventLoop()функция используется для прослушивания событий, полученных нитью.

ВeventLoop()функция возвращает информацию о событиях, полученную текущей нитью.Информационная структура событий.

объект, нулевое значение

СобытиеLoop() EventLoop ((Timeout))

Параметрtimeout- это настройка времени в миллисекундах. Если параметрtimeoutЕсли значение будет установлено на 0, оно будет ждать, пока произойдет событие, прежде чем возвращать. Если оно больше 0, оно будет устанавливать время ожидания события. Если оно меньше 0, оно немедленно вернет последнее событие.

Тайм-аут ложное Номер

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

Используйте три потока одновременно и выводите полученную информацию о событии.

Механизм обработкиeventLoop()функция такая же, как и глобальная функцияEventLoop().

{@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/Threads/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/name name}

Закрыть

Объект блокировки потока, используемый для многопоточной синхронизации.

приобретать

Вacquire()Функция используется для запроса блокировки нити (блокировки).

приобретать

Пожалуйста, обратитесь кthreading.Lock()Раздел для примеров.

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

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release}

освобождение

Вrelease()Функция используется для освобождения блокировки нити (отключения).

освобождение))

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

Испытание сценариев тупика

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

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/threading/Lock Lock}, {@fun/Threads/Threads/ThreadLock/acquire acquire}, {@fun/Threads/Threads/acquire acquire}, {@fun/Threads/Threads/acquire acquire}, {@fun/Threads/Threads/Threads/Lock Lock}, {@fun/Threads/Threads/Threads/acquire}, {@threading/LockLock}, {@fun/Threads/Threads/Threads/threads}

Ведущий

Объект события, используемый для многопоточных уведомлений и сигналов о событиях.

набор

Вset()Функция используется для уведомления о событиях (настроенные сигналы).

набор ((()

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

Если сигнал настроен с использованиемset()Мы должны очистить сигнал и установить его снова.

{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

Прозрачно

Вclear()Функция используется для очистки сигнала.

Прозрачно.

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}

Подождите.

Вwait()функция используется для установки ожидания события (сигнала) и блокируется до установки события (сигнала); она поддерживает установку параметра timeout.

Вwait()Функция возвращает значение true.

Буль

Подождите. Подождите.

ВtimeoutПараметр используется для установки времени ожидания в миллисекундах.

Тайм-аут ложное Номер

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

Испытать возвращаемое значениеwait() function.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}

isSet

ВisSet()Функция используется для определения того, было ли установлено событие (сигнал).

ВisSet()Функция возвращает значение true, если событие (сигнал) установлено.

Буль

isSet ((()

Пожалуйста, обратитесь кthreading.Event()Раздел для примеров.

{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}

ThreadCondition (Условие)

Объект условий, используемый для многопоточной синхронизации.

Уведомить

Вnotify()Функция используется для пробуждения ожидающего потока (если таковой имеется).wait()Метод будет пробужден.

Уведомлять

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

Используйтеnotify()Функция пробуждает ждущую нить.

Вnotify()функция просыпается нить в очереди ожидания.

Когдаnotify()Функция пробуждает нить, нить восстановит блокировку нитки.

{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

Уведомить всех

ВnotifyAll()Функция пробуждает все ожидающие нитки.

Уведомить все ((()

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

ВnotifyAll()Функция пробуждает все ожидающие нитки по одному, и пробужденные нитки восстанавливают блокировку нитки.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

Подождите.

Вwait()Функция используется, чтобы заставить нить ждать в определенных условиях.

Подождите.

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

Вwait()Функция освобождает замок нити и восстанавливает замок нити при пробуждении.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}

приобретать

Вacquire()Функция используется для запроса блокировки нити (блокировки).

приобретать

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

Перед применениемwait(), вам нужно запросить блокировку потока (блокировку) текущего объекта состояния.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}

освобождение

Вrelease()Функция используется для освобождения блокировки нити (отключения).

освобождение))

Пожалуйста, обратитесь кThreadCondition.notify()Раздел для примеров.

После примененияwait(), мы должны освободить замок нитки (разблокировать) объекта текущего состояния.

{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}

ThreadDict

Объект словаря, используемый для обмена данными.

Пойдем.

Вget()Функция используется для получения ключевого значения, записанного в объекте словаря.

Вget()Функция возвращает значение ключа, указанногоkey parameter.

string, number, bool, object, array, null value и другие типы, поддерживаемые системой

Get (ключ)

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

ключ неправда строка

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

Использовать объекты событий для уведомления потоков для чтения и изменения данных.

{@fun/Threads/ThreadDict/set set} - Я не знаю.

набор

Вset()функция используется для установки пары ключей-значений.

набор (ключ, значение)

Параметрkeyиспользуется для настройки имени ключа, который должен быть изменен.

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

стоимость Истинно string, number, bool, object, array, function, null value и другие типы, поддерживаемые системой

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

Он поддерживает передачу ключевых значений в функции.

{@fun/Threads/ThreadDict/get get} - Что ты делаешь?

Настройки сети Веб3