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 Они могут быть переданы в среду потока в качестве параметров функции выполнения потока. |
Вthreading
object - это глобальный инструмент управления многопотоками, который предоставляет такие функции, как создание одновременных потоков, блокировки потоков и объекты условий.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()
функция используется для получения объекта потока на основе указанного 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()
.
В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()
}
Он поддерживает отправку функции.
Когда функция выполнения threadpostMessage()
Функция для отправки сигнала или данных, событие сообщения также генерируется.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
объектсодержит данные о результате выполнения.
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()
Данные действительны, когда нить не выполняет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 ((ключ, значение)
В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}
В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()
Функция возвращает значение true, если событие (сигнал) установлено.
Буль
isSet ((()
Пожалуйста, обратитесь кthreading.Event()
Раздел для примеров.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}
Объект условий, используемый для многопоточной синхронизации.
В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}
Объект словаря, используемый для обмена данными.
В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