Tài nguyên đang được tải lên... tải...

Sợi

FMZ Quant Trading Platform thực sự hỗ trợ các chức năng đa luồng củaJavaScriptchiế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, releaseChú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, isSetChú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, releaseChú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, setChú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.

sợi

Cácthreadingobject 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ácJavaScriptchiến lược ngôn ngữ.

Sợi

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ốfunclà 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.funccó thể chấp nhận nhiều tham số, mà sẽ được truyền qua...argsDo đó, danh sách tham số củafunccần phải phù hợp với...args.

chức đúng chức năng Các thông sốarglà 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ủafunccầ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ốitemlà 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.itemcá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}

getThread

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ốthreadIdlà 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}

mainThread

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

CurrentThread (đề tài hiện tại)

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

Khóa

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}

Điều kiện

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}

Sự kiện

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}

Đề tài

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}

đang chờ

Cácpendinghà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}

Sợi

Threadcác đối tượng có thể được tạo hoặc trả về bởithreading.Thread(), threading.getThread(), threading.mainThread(), vàthreading.currentThread().

peekMessage

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ốtimeoutlà 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ặctimeouttham 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}

postMessage

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ốmsglà 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 threads gọipostMessage()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}

tham gia

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.

  • id: Thread ID.
  • kết thúc: Có phải sợi được buộc phải kết thúc hay không.
  • đã trôi qua: Thời gian chạy của sợi trong nano giây.
  • ret: Giá trị trả về của hàm thread.

ThreadRetđối tượng

tham gia tham gia ((timeout)

Cáctimeouttham 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.timeouttham số được thiết lập thành 0 hoặctimeouttham 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.timeouttham 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}

kết thúc

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}

getData

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ớikeytham 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áckeytham 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óacounttrong môi trường thread đồng thời, và sau đó đọc giá trị khóa củacounttrong 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}

setData

CácsetData()function được sử dụng để lưu trữ các biến trong ngữ cảnh thread.

setData ((key, giá trị)

Cáckeytham 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ácvaluetham 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ốvaluephả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}

id

Cácid()hàm được sử dụng để trả vềthreadIdcủ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 rathreadIdcủ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}

tên

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}

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ốtimeoutlà 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}

ThreadLock

Đối tượng khóa Thread, được sử dụng để xử lý đồng bộ hóa nhiều thread.

có được

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}

giải phóng

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}

ThreadEvent

Đố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.

tập hợp

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}

rõ ràng

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}

Chờ đã.

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

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}

ThreadCondition

Đối tượng điều kiện, được sử dụng để đồng bộ hóa nhiều luồng.

thông báo

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}

thông báo cho tất cả

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}

Chờ đã.

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ó được

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}

giải phóng

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}

ThreadDict

Đối tượng từ điển, dùng để chia sẻ dữ liệu.

lấy

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

tập hợp

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