FMZ Quant Trading Platform thực sự hỗ trợ các chức năng đa luồng củaJavaScript
chiến lược ngôn ngữ từ dưới cùng của hệ thống, và thực hiện các mục tiêu sau:
Các đối tượng | Hướng dẫn | Nhận xét |
---|---|---|
sợi | Đối tượng toàn cầu đa luồng | Các chức năng của thành viên:Thread , getThread , mainThread , vv |
Sợi | Đối tượng Thread | Các chức năng của thành viên:peekMessage , postMessage , join , vv |
ThreadLock | Đối tượng khóa sợi | Các chức năng của thành viên:acquire , release Chúng có thể được truyền vào môi trường thread như các tham số của chức năng thực thi thread. |
ThreadEvent | Đối tượng sự kiện | Các chức năng của thành viên:set , clear , wait , isSet Chúng có thể được truyền vào môi trường thread như một tham số của chức năng thực thi thread. |
ThreadCondition | Đối tượng điều kiện | Các chức năng của thành viên:notify , notifyAll , wait , acquire , release Chúng có thể được truyền vào môi trường thread như một tham số của chức năng thực thi thread. |
ThreadDict | Đối tượng từ điển | Các chức năng của thành viên:get , set Chúng có thể được truyền vào môi trường thread như các tham số của chức năng thực thi thread. |
Cácthreading
object là một công cụ quản lý đa luồng toàn cầu cung cấp các chức năng như tạo các luồng đồng thời, khóa luồng và đối tượng điều kiện.threading
đối tượng này chỉ được hỗ trợ bởi cácJavaScript
chiến lược ngôn ngữ.
CácThread()
chức năng được sử dụng để tạo các chủ đề đồng thời.
CácThread()
hàm trả về aThread
đối tượng, được sử dụng để quản lý các chủ đề đồng thời được tạo, giao tiếp chủ đề, v.v.
Thread
đối tượng
Thread ((func,...args) Thread ((... item)
Các thông sốfunc
là một hàm để thực thi đồng thời (được truyền qua tham chiếu), và hỗ trợ truyền vào các hàm ẩn danh.func
có thể chấp nhận nhiều tham số, mà sẽ được truyền qua...args
Do đó, danh sách tham số củafunc
cần phải phù hợp với...args
.
chức
đúng
chức năng
Các thông sốarg
là tham số thực tế được truyền đếnfunc
(tức là chức năng thực thi chuỗi đồng thời) khi callback được thực hiện; có thể có nhiều tham sốarg
, và danh sách tham số củafunc
cần phải phù hợp với...args
.
arg
sai
chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống
Các thông sốitem
là một mảng chứa các tham chiếu hàm và các tham số của chúng để được thực hiện đồng thời.item
các tham số có thể được truyền vào khi gọiThread
function.
mục đúng mảng
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()
}
Tạo các chủ đề đồng thời cho cả hàm tùy chỉnh và hàm ẩn danh.
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()
}
Sử dụngThread(...items)
hình thức để tạo các chủ đề đồng thời và thực hiện nhiều chức năng liên tục.
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()
}
Nó hỗ trợ truyền tham số đến các chức năng được thực hiện đồng thời.
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)
}
Nó hỗ trợ truyền các chuỗi hàm và có thể nhập thư viện bên ngoài một cách năng động để tính toán đồng thời.
Chức năng sợifunc
đã đi vàoThread()
Function for concurrent execution runs in an isolated environment, so variables outside the thread cannot be directly referenced, and compilation will fail when referenced. Đồng thời, các tham chiếu đến các hàm đóng khác không được hỗ trợ trong thread. Tất cả các API được cung cấp bởi nền tảng có thể được gọi trong thread, nhưng các hàm được người dùng xác định khác không thể được gọi.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp. Tất cả các chức năng liên quan đến luồng đồng thời chỉ được hỗ trợ như khả năng tương thích mã trong hệ thống backtesting và sẽ không thực sự được thực hiện bởi luồng đồng thời, vì vậy chúng sẽ không được lặp lại trong chương này.
{@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}
CácgetThread()
hàm được sử dụng để lấy đối tượng thread dựa trên ID thread được chỉ định.
CácgetThread()
hàm trả vềThread
đối tượng với threadId được chỉ định bởi tham số
Thread
đối tượng
getThread ((ThreadId)
Các thông sốthreadId
là ID đối tượng thread. Nhận đối tượng thread tương ứng bằng cách chỉ định tham số.
ThreadId đúng số
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())
}
Đưa đối tượng chủ đề được chỉ định quathreadId
.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
Nếu chủ đề bạn muốn lấy đã được thực hiện và phát hành, bạn không thể sử dụngthreading.getThread(threadId)
để có được đối tượng của sợi.
{@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/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}
CácmainThread()
chức năng được sử dụng để có được đối tượng sợi của sợi chính, đó là sợi màmain()
chức năng trong chiến lược được đặt.
CácmainThread()
hàm trả về đối tượng thread của thread chính.
Thread
đối tượng
mainThread()
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
Lấy cáiThread
đối tượng của dây chính và đầu rathreadId
của chủ đề.
function test() {
Log("Output the main thread ID in the test function:", threading.mainThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Đối tượng sợi của sợi chính cũng có thể được lấy trong các sợi song song.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@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/pending pending}, {@fun/Threads/threading/eventLoop Loop}
CáccurrentThread()
chức năng được sử dụng để có được đối tượng thread của thread hiện tại.
CáccurrentThread()
hàm trả về đối tượng thread của thread hiện tại.
Thread
đối tượng
CurrentThread (()
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
Lấy cáiThread
đối tượng của dòng dây và đầu rathreadId
của dòng hiện tại.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threads/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop eventLoop}
CácLock()
chức năng được sử dụng để tạo ra một đối tượng khóa thread.
CácLock()
hàm trả về một đối tượng khóa thread.
ThreadLock
đối tượng
Khóa khóa.
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()
}
Hai chủ đề đồng thời truy cập một tài nguyên chung.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/ThreadThread}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/Event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/threading/eventLoop}
CácCondition()
function được sử dụng để tạo một đối tượng biến điều kiện, được sử dụng để đạt được đồng bộ hóa và giao tiếp giữa các luồng trong một môi trường đồng thời đa luồng.Condition()
, một chuỗi có thể chờ khi một số điều kiện nhất định không được đáp ứng cho đến khi một chuỗi khác thông báo cho nó rằng điều kiện đã được đáp ứng.
CácCondition()
hàm trả về aThreadCondition
object.
ThreadCondition
đối tượng
Tình trạng
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()
}
Hai chủ đề đồng thời truy cập một tài nguyên chung.
Hệ thống backtesting không thực hiện chức năng này, nó chỉ xác định nó.
{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threading/threading/event Event}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}
CácEvent()
chức năng được sử dụng để tạo ra mộtsự kiện threadđối tượng, được sử dụng để đồng bộ hóa giữa các luồng, cho phép một luồng chờ thông báo hoặc tín hiệu từ luồng khác.
CácEvent()
hàm trả về aThreadEvent
object.
ThreadEvent
đối tượng
Sự kiện
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()
}
Hai chủ đề đồng thời truy cập một tài nguyên chung.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@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/threading/Thread Thread}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop}
CácDict()
function được sử dụng để tạo một đối tượng từ điển để chuyển sang các luồng đồng thời.
CácDict()
hàm trả về aThreadDict
object.
ThreadDict
đối tượng
Định nghĩa
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()
}
Chuyển một đối tượng bình thường sang chức năng thực thi luồng đồng thời để kiểm tra xem việc sửa đổi giá trị khóa của đối tượng sẽ gây ra thay đổi giá trị khóa của đối tượng trong các luồng khác.
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()
}
Đưa qua.ThreadDict
đối tượng được tạo ra bởiDict()
chức năng với chức năng thực thi luồng đồng thời, và kiểm tra xem việc sửa đổi giá trị khóa của đối tượng sẽ làm cho giá trị khóa của đối tượng trong các luồng khác thay đổi hay không.
Khi một đối tượng chung được truyền đến một hàm luồng đồng thời, nó được truyền như một bản sao sâu.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@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/threading/Thread Thread}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}
Cácpending
hàm được sử dụng để lấy số lượng các chủ đề đồng thời chạy trong chương trình chiến lược hiện tại.
Cácpending()
hàm trả về số lượng các chủ đề đồng thời mà chương trình chiến lược hiện tại đang chạy.
số
đang chờ ((()
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())
}
Tạo hai chủ đề chạy đồng thời và gọipending()
hoạt động tại các nút thời gian khác nhau.
Khi chiến lượcmain()
hàm bắt đầu chạy, gọi hàmpending()
trực tiếp sẽ trả về 1, bởi vì các chủ đề mà chiến lượcmain()
chức năng được đặt cũng là một chủ đề đang chờ.
Nó hỗ trợ hệ thống backtesting và môi trường giao dịch trực tiếp.
{@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
các đối tượng có thể được tạo hoặc trả về bởithreading.Thread()
, threading.getThread()
, threading.mainThread()
, vàthreading.currentThread()
.
CácpeekMessage()
hàm được sử dụng để nhận một thông điệp từ một chủ đề.
CácpeekMessage()
hàm trả về thông điệp được nhận bởi chủ đề liên kết với đối tượng chủ đề hiện tại.
chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống
peekMessage() peekMessage ((timeout)
Các thông sốtimeout
là thiết lập thời gian hết. Nó sẽ chặn và chờ số milliseconds được thiết lập bởi tham số và trả về dữ liệu. Nếu không có dữ liệu và thời gian hết vượt quá giới hạn, giá trị null sẽ được trả về. Nếutimeout
được thiết lập thành 0 hoặctimeout
tham số không được thông qua, nó có nghĩa là quá trình sẽ chặn và chờ đợi cho đến khi dữ liệu được nhận từ kênh.timeout
được đặt thành -1, điều đó có nghĩa là quá trình sẽ không chặn và trả về dữ liệu ngay lập tức. Nếu không có dữ liệu, giá trị null sẽ được trả về.
thời gian nghỉ sai số
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()
}
Gửi tin nhắn đến chủ đề chính từ một chủ đề đồng thời.
Khi viết chương trình, chúng ta cần chú ý đến các vấn đề bế tắc.
{@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/Thread/name}, {@Threads/Threads/eventLoop eventLoop}
CácpostMessage()
hàm được sử dụng để gửi một thông điệp đến một chủ đề.
postMessage ((msg)
Các thông sốmsg
là thông điệp được gửi đi.
msg đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.
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()
}
Gửi tin nhắn trong các chủ đề đồng thời và sử dụngeventLoop()
để nhận thông báo tin nhắn.
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()
}
Nó hỗ trợ gửi một hàm.
Khi một hàm thực thi threadpostMessage()
chức năng để gửi một tín hiệu hoặc dữ liệu, một sự kiện tin nhắn cũng được tạo ra.eventLoop()
chức năng để nhận thông báo tin nhắn.
{@fun/Threads/Thread/peekMessage peekMessage}, {@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 name}, {@fun/Threads/Thread/eventLoop eventLoop}
Cácjoin()
chức năng được sử dụng để chờ cho các luồng để thoát và lấy lại các tài nguyên hệ thống.
CácThreadRet
đối tượngchứa dữ liệu về kết quả thực hiện.
ThreadRet
đối tượng
tham gia tham gia ((timeout)
Cáctimeout
tham số được sử dụng để thiết lập thời gianout trong milliseconds cho chờ đợi cho các thread để kết thúc.timeout
tham số được thiết lập thành 0 hoặctimeout
tham số không được thiết lập,join()
chức năng sẽ chặn và chờ cho đến khi các chủ đề hoàn thành thực thi.timeout
tham số được thiết lập thành -1,join()
chức năng sẽ trở lại ngay lập tức.
thời gian nghỉ sai số
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}
}
Kiểm trajoin()
chức năng cho thời gian nghỉ và đầu ra giá trị trả về.
Cácjoin()
hàm thời gian ra và trở lạiundefined
.
{@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/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Cácterminate()
chức năng được sử dụng để kết thúc một thread và giải phóng các tài nguyên phần cứng được sử dụng bởi thread được tạo.
kết thúc ((()
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)
}
}
Kết thúc thực thi một chủ đề bằng vũ lực Sau khi kết thúc một chủ đề bằng vũ lực, sẽ không có đầu ra từ chủ đề này trong nhật ký.
Đối với các sợi được kết thúc bằng vũ lực bởi cácterminate()
chức năng, chúng ta không thể sử dụngjoin()
chức năng để chờ đợi chúng chấm dứt.
{@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/Thread/eventLoop eventLoop}
CácgetData()
Dữ liệu là hợp lệ khi thread chưa thực thi cácjoin()
chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()
chức năng (kết thúc sợi dây bằng vũ lực).
CácgetData()
hàm trả về giá trị khóa tương ứng vớikey
tham số trong cặp giá trị khóa được lưu trữ trong ngữ cảnh luồng hiện tại.
chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống
getData() getData ((key)
Cáckey
tham số là tên khóa của cặp giá trị khóa được lưu trữ.
chìa khóa đúng chuỗi
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()
}
Ghi lại giá trị của khóacount
trong môi trường thread đồng thời, và sau đó đọc giá trị khóa củacount
trong chủ đề.
{@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}
CácsetData()
function được sử dụng để lưu trữ các biến trong ngữ cảnh thread.
setData ((key, giá trị)
Cáckey
tham số được sử dụng để chỉ định tên khóa của cặp giá trị khóa được lưu trữ.
chìa khóa
đúng
chuỗi
Cácvalue
tham số được sử dụng để xác định giá trị khóa của cặp giá trị khóa được lưu trữ.
giá trị đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Sleep(1000)
Log(`t1.getData("data"):`, t1.getData("data"))
t1.join()
}
Đặt cặp key-value trong thread đồng thời và đọc cặp key-value trong thread chính.
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()
}
Nó hỗ trợ chuyển giá trị khóa sang các hàm.
Dữ liệu là hợp lệ khi chủ đề chưa thực hiệnjoin()
chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()
Các giá trị của tham sốvalue
phải là một biến có thể được nối tiếp.
{@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 name}, {@fun/Threads/Thread/eventLoop eventLoop}
Cácid()
hàm được sử dụng để trả vềthreadId
của các trường hợp đối tượng đa luồng hiện tại.
Giá trị trả lại củaid()
chức năng làthreadId
.
số
id()
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}
Tạo một chủ đề chạy đồng thời và đầu rathreadId
của chuỗi đồng thời này trong chuỗi chính.
{@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 setData}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}
Cácname()
function được sử dụng để trả lại tên của các trường hợp đối tượng đa luồng hiện tại.
Cácname()
hàm trả về tên chủ đề đồng thời.
chuỗi
tên
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}
Tạo một chủ đề đồng thời và xuất ra tên của chủ đề đồng thời trong chủ đề chính.
{@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/Thread/Thread/eventLoop eventLoop}
CáceventLoop()
chức năng được sử dụng để nghe các sự kiện được nhận bởi các chủ đề.
CáceventLoop()
hàm trả về thông tin sự kiện nhận được bởi các chủ đề hiện tại. XemCấu trúc thông tin sự kiện.
đối tượng, giá trị không
eventLoop (() eventLoop (thời gian hết)
Các thông sốtimeout
là thiết lập timeout trong milliseconds. Nếu tham sốtimeout
được thiết lập là 0, nó sẽ chờ cho một sự kiện xảy ra trước khi trả về. Nếu lớn hơn 0, nó sẽ thiết lập thời gian chờ sự kiện. Nếu nhỏ hơn 0, nó sẽ trả về sự kiện mới nhất ngay lập tức.
thời gian nghỉ sai số
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()
}
Chạy ba chủ đề đồng thời và xuất thông tin sự kiện nhận được. Nếu thời gian hết hoặc hàm trả về ngay lập tức, giá trị đầu ra là không.
Cơ chế xử lýeventLoop()
chức năng là giống như chức năng toàn cầuEventLoop()
.
{@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 setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name name}
Đối tượng khóa Thread, được sử dụng để xử lý đồng bộ hóa nhiều thread.
Cácacquire()
chức năng được sử dụng để yêu cầu khóa sợi ( khóa).
có được (((
Vui lòng tham khảothreading.Lock()
phần cho các ví dụ.
Cácacquire()
chức năng được sử dụng để yêu cầu một khóa thread.acquire()
chức năng của một đối tượng khóa chủ đề, nó cố gắng mua khóa. Nếu khóa hiện không được giữ bởi một chủ đề khác, chủ đề gọi thành công mua khóa và tiếp tục thực thi. Nếu khóa đã được giữ bởi một chủ đề khác, chủ đề gọiacquire()
sẽ bị chặn cho đến khi khóa được giải phóng.
{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release}
Cácrelease()
chức năng được sử dụng để giải phóng khóa sợi (đánh khóa).
giải phóng
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()
}
Kiểm tra các kịch bản bế tắc
Cần lưu ý rằng việc sử dụng khóa sợi không đúng cách có thể dẫn đến bế tắc.
{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}
Đối tượng sự kiện, được sử dụng cho thông báo và tín hiệu sự kiện đa luồng.
Cácset()
chức năng được sử dụng để thông báo các sự kiện (đặt tín hiệu).
set (()
Vui lòng tham khảothreading.Event()
phần cho các ví dụ.
Nếu tín hiệu đã được đặt bằng cách sử dụngset()
Chúng ta phải xóa tín hiệu và đặt lại.
{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Cácclear()
chức năng được sử dụng để xóa tín hiệu.
rõ ràng.
Vui lòng tham khảothreading.Event()
phần cho các ví dụ.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}
Cácwait()
chức năng được sử dụng để thiết lập một sự kiện ( tín hiệu) chờ đợi, và sẽ chặn trước khi sự kiện ( tín hiệu) được thiết lập; nó hỗ trợ thiết lập một tham số timeout.
Cácwait()
hàm trả về xem timeout đã xảy ra. Nếu có, nó trả về một giá trị true.
bool
chờ chút nhé. chờ (đến thời điểm hết)
Cáctimeout
tham số được sử dụng để thiết lập thời gian chờ trong milliseconds.
thời gian nghỉ sai số
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()
}
Kiểm tra giá trị trả về củawait()
function.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}
CácisSet()
chức năng được sử dụng để xác định xem một sự kiện ( tín hiệu) đã được thiết lập.
CácisSet()
hàm trả về xem sự kiện (dấu hiệu) đã được thiết lập; nếu sự kiện (dấu hiệu) đã được thiết lập, nó trả về một giá trị true.
bool
isSet()
Vui lòng tham khảothreading.Event()
phần cho các ví dụ.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}
Đối tượng điều kiện, được sử dụng để đồng bộ hóa nhiều luồng.
Cácnotify()
hàm được sử dụng để đánh thức một luồng chờ (nếu có). Chỉ luồng đã gọiwait()
Phương pháp sẽ được đánh thức.
thông báo
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)
}
}
Sử dụngnotify()
chức năng để đánh thức dây chờ.
Cácnotify()
hàm đánh thức một chủ đề trong hàng đợi.
Khinotify()
chức năng đánh thức một thread, thread sẽ lấy lại khóa thread.
{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
CácnotifyAll()
chức năng đánh thức tất cả các chủ đề đang chờ.
thông báo tất cả
Vui lòng tham khảoThreadCondition.notify()
phần cho các ví dụ.
CácnotifyAll()
chức năng đánh thức tất cả các chuỗi đang chờ một một, và các chuỗi được đánh thức lấy lại khóa chuỗi.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Cácwait()
chức năng được sử dụng để làm cho một sợi chờ dưới một số điều kiện thiết kế nhất định.
chờ chút nhé.
Vui lòng tham khảoThreadCondition.notify()
phần cho các ví dụ.
Cácwait()
chức năng giải phóng khóa sợi và lấy lại khóa sợi khi thức dậy.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}
Cácacquire()
chức năng được sử dụng để yêu cầu khóa sợi ( khóa).
có được (((
Vui lòng tham khảoThreadCondition.notify()
phần cho các ví dụ.
Trước khi sử dụngwait()
, bạn cần phải yêu cầu khóa thread của đối tượng điều kiện hiện tại.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}
Cácrelease()
chức năng được sử dụng để giải phóng khóa sợi (đánh khóa).
giải phóng
Vui lòng tham khảoThreadCondition.notify()
phần cho các ví dụ.
Sau khi sử dụngwait()
, chúng ta cần để giải phóng khóa thread (mở khóa) của đối tượng điều kiện hiện tại.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}
Đối tượng từ điển, dùng để chia sẻ dữ liệu.
Cácget()
hàm được sử dụng để có được giá trị khóa được ghi trong đối tượng từ điển.
Cácget()
hàm trả về giá trị của khóa được chỉ định bởikey
parameter.
chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống
get ((key)
Cáckey
tham số được sử dụng để chỉ định tên khóa tương ứng với khóa được lấy.
chìa khóa đúng chuỗi
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"))
}
Sử dụng các đối tượng sự kiện để thông báo cho các luồng để đọc và sửa đổi dữ liệu.
{@fun/Threads/ThreadDict/set set}
Cácset()
hàm được sử dụng để thiết lập một cặp giá trị khóa.
set (key, value)
Các thông sốkey
được sử dụng để thiết lập tên khóa được sửa đổi.
chìa khóa
đúng
chuỗi
Các thông sốvalue
được sử dụng để thiết lập giá trị khóa được sửa đổi.
giá trị đúng chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống
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()
}
Nó hỗ trợ chuyển giá trị khóa sang các hàm.
{@fun/Threads/ThreadDict/get get}
NetSettings Web3