Sumber daya yang dimuat... Pemuatan...

Benang

FMZ Quant Trading Platform benar-benar mendukung fungsi multi-threaded dariJavaScriptstrategi bahasa dari bawah sistem, dan menerapkan tujuan berikut:

Objek Panduan Pengamatan
Pembuatan thread Objek global multi-threaded Fungsi anggota:Thread, getThread, mainThread, dll.
Benang Objek thread Fungsi anggota:peekMessage, postMessage, join, dll.
ThreadLock Objek penguncian benang Fungsi anggota:acquire, release. Mereka dapat diteruskan ke lingkungan thread sebagai parameter dari fungsi eksekusi thread.
ThreadEvent Objek acara Fungsi anggota:set, clear, wait, isSet. Mereka dapat diteruskan ke lingkungan thread sebagai parameter dari fungsi eksekusi thread.
ThreadKondisi Objek kondisi Fungsi anggota:notify, notifyAll, wait, acquire, release. Mereka dapat diteruskan ke lingkungan thread sebagai parameter dari fungsi eksekusi thread.
ThreadDict Objek kamus Fungsi anggota:get, set. Mereka dapat diteruskan ke lingkungan thread sebagai parameter dari fungsi eksekusi thread.

Pembuatan thread

Peraturanthreadingobject adalah alat manajemen multithreading global yang menyediakan fungsi seperti membuat thread paralel, kunci thread, dan objek kondisi.threadingObyek ini hanya didukung olehJavaScriptstrategi bahasa.

Benang

PeraturanThread()fungsi digunakan untuk membuat thread bersamaan.

PeraturanThread()fungsi mengembalikan aThreadobjek, yang digunakan untuk mengelola thread yang dibuat secara bersamaan, komunikasi thread, dll.

Threadobjek

Thread ((func,...args) Thread ((...item)

Parameterfuncadalah fungsi untuk eksekusi bersamaan (diperkenalkan dengan referensi), dan mendukung pemasangan fungsi anonim.funcdapat menerima beberapa parameter, yang akan diteruskan melalui...argsOleh karena itu, daftar parameter darifuncharus konsisten dengan...args.

fungsi benar fungsi Parameterargadalah parameter aktual yang diteruskan kefunc(yaitu fungsi pelaksanaan thread bersamaan) ketika callback dijalankan; mungkin ada beberapa parameterarg, dan daftar parameter darifuncharus konsisten dengan...args.

arg palsu string, number, bool, object, array, function, null value dan tipe lain yang didukung oleh sistem Parameteritemadalah array yang berisi referensi fungsi dan parameter mereka yang akan dijalankan secara bersamaan.itemparameter dapat diteruskan dalam ketika memanggilThread function.

item benar Array

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

Buat thread bersamaan untuk fungsi kustom dan fungsi anonim.

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

GunakanThread(...items)bentuk untuk membuat thread bersamaan dan menjalankan beberapa fungsi secara berurutan.

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

Ini mendukung lulus parameter ke fungsi yang dijalankan secara bersamaan.

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

Ini mendukung lulus dalam string fungsi dan dapat mengimpor perpustakaan eksternal secara dinamis untuk komputasi simultan.

Fungsi benangfuncmelewati ke dalamThread()fungsi untuk eksekusi bersamaan berjalan di lingkungan yang terisolasi, sehingga variabel di luar thread tidak dapat dirujuk secara langsung, dan kompilasi akan gagal ketika dirujuk. Pada saat yang sama, referensi ke fungsi penutupan lainnya tidak didukung di dalam thread. Semua API yang disediakan oleh platform dapat dipanggil di dalam thread, tetapi fungsi yang didefinisikan pengguna lainnya tidak dapat dipanggil.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung. Semua fungsi terkait thread bersamaan hanya didukung sebagai kompatibilitas kode dalam sistem backtesting dan tidak akan benar-benar dieksekusi oleh thread bersamaan, jadi mereka tidak akan diulang dalam bab ini.

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

PeraturangetThread()Fungsi ini digunakan untuk mendapatkan objek thread berdasarkan ID thread yang ditentukan.

PeraturangetThread()fungsi mengembalikanThreadobjek dengan threadId yang ditentukan oleh parameter

Threadobjek

getThread ((threadId)

ParameterthreadIdadalah ID objek thread. Dapatkan objek thread yang sesuai dengan menentukan parameter.

ThreadId benar Nomor

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

Dapatkan objek thread yang ditentukan melaluithreadId.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

Jika thread yang ingin Anda dapatkan telah dieksekusi dan dilepaskan, Anda tidak dapat menggunakanthreading.getThread(threadId)untuk mendapatkan objek benang benang.

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

mainThread

PeraturanmainThread()fungsi digunakan untuk mendapatkan objek benang dari benang utama, yaitu benang di manamain()fungsi dalam strategi yang terletak.

PeraturanmainThread()fungsi mengembalikan objek thread dari thread utama.

Threadobjek

mainThread ((()

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

DapatkanThreadobjek dari benang utama dan outputthreadIddari benang utama.

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

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

Objek benang dari benang utama juga dapat diperoleh dalam benang paralel.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

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

Thread saat ini

PeraturancurrentThread()fungsi digunakan untuk mendapatkan objek thread dari thread saat ini.

PeraturancurrentThread()fungsi mengembalikan objek thread dari thread saat ini.

Threadobjek

currentThread ((()

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

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

DapatkanThreadobjek dari benang arus dan outputthreadIddari benang saat ini.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/eventLoop pending}, {@fun/Threads/threading/eventLoop eventLoop}

Kunci

PeraturanLock()fungsi digunakan untuk membuat obyek thread lock.

PeraturanLock()fungsi mengembalikan objek thread lock.

ThreadLockobjek

Kunci (()

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

Dua thread bersamaan mengakses sumber daya yang sama.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

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

Kondisi

PeraturanCondition()fungsi digunakan untuk membuat objek variabel kondisi, yang digunakan untuk mencapai sinkronisasi dan komunikasi antara thread dalam lingkungan serentak multi-threaded.Condition(), sebuah thread dapat menunggu ketika kondisi tertentu tidak terpenuhi sampai thread lain memberitahunya bahwa kondisi telah terpenuhi.

PeraturanCondition()fungsi mengembalikan aThreadCondition object.

ThreadConditionobjek

Kondisi

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

Dua thread bersamaan mengakses sumber daya yang sama.

Sistem backtesting tidak menerapkan fungsi ini, hanya mendefinisikannya.

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

Peristiwa

PeraturanEvent()fungsi digunakan untuk membuatacara threadobjek, yang digunakan untuk sinkronisasi antara thread, memungkinkan satu thread untuk menunggu pemberitahuan atau sinyal dari thread lain.

PeraturanEvent()fungsi mengembalikan aThreadEvent object.

ThreadEventobjek

Acara

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

Dua thread bersamaan mengakses sumber daya yang sama.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

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

Dict

PeraturanDict()fungsi digunakan untuk membuat objek kamus untuk lulus ke thread bersamaan.

PeraturanDict()fungsi mengembalikan aThreadDict object.

ThreadDictobjek

Dict ((()

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

Melalui objek normal ke fungsi pelaksanaan thread bersamaan untuk menguji apakah memodifikasi nilai kunci objek akan menyebabkan perubahan nilai kunci objek di thread lain.

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

BerikanThreadDictobjek yang dibuat olehDict()fungsi ke fungsi eksekusi thread bersamaan, dan menguji apakah memodifikasi nilai kunci objek akan menyebabkan nilai kunci objek dalam thread lain berubah.

Ketika sebuah objek umum diteruskan ke fungsi thread bersamaan, itu diteruskan sebagai salinan mendalam.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

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

sedang menunggu

PeraturanpendingFungsi ini digunakan untuk mendapatkan jumlah thread bersamaan yang berjalan dalam program strategi saat ini.

Peraturanpending()fungsi mengembalikan jumlah thread bersamaan yang sedang dijalankan oleh program strategi saat ini.

nomor

sedang menunggu ((()

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

Buat dua thread yang berjalan bersamaan dan panggilpending()fungsi pada titik waktu yang berbeda.

Ketika strategimain()fungsi mulai berjalan, memanggil fungsipending()langsung akan mengembalikan 1, karena benang utama di mana strategimain()fungsi yang terletak juga thread yang sedang menunggu.

Ini mendukung sistem backtesting dan lingkungan perdagangan langsung.

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

Benang

Threadobjek dapat dibuat atau dikembalikan olehthreading.Thread(), threading.getThread(), threading.mainThread(), danthreading.currentThread().

PeekMessage

PeraturanpeekMessage()fungsi digunakan untuk mendapatkan pesan dari thread.

PeraturanpeekMessage()fungsi mengembalikan pesan yang diterima oleh thread yang terkait dengan objek thread saat ini.

string, number, bool, object, array, null value dan jenis lain yang didukung oleh sistem

PeekMessage (() peekMessage (timeout)

Parametertimeoutadalah pengaturan timeout. Ini akan memblokir dan menunggu jumlah milidetik yang ditetapkan oleh parameter dan mengembalikan data. Jika tidak ada data dan timeout melebihi batas, nilai nol akan dikembalikan. Jikatimeoutditetapkan menjadi 0 atautimeoutparameter tidak dilewati, itu berarti bahwa proses akan memblokir dan menunggu sampai data diterima dari saluran.timeoutJika nilai yang ditetapkan adalah -1, berarti bahwa proses tidak akan memblokir dan mengembalikan data segera.

timeout palsu Nomor

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

Kirim pesan ke thread utama dari thread paralel.

Saat menulis program, kita perlu memperhatikan masalah thread deadlock.

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

PeraturanpostMessage()fungsi digunakan untuk mengirim pesan ke thread.

postMessage ((msg)

Parametermsgadalah pesan yang akan dikirim.

msg benar Setiap jenis yang didukung oleh sistem, seperti string, angka, bool, objek, array, fungsi, nilai nol, dll.

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

Kirim pesan dalam thread bersamaan dan gunakaneventLoop()untuk menerima pemberitahuan pesan.

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

Ini mendukung mengirim fungsi.

Ketika fungsi eksekusi threads memanggilpostMessage()fungsi untuk mengirim sinyal atau data, sebuah peristiwa pesan juga dihasilkan.eventLoop()fungsi untuk menerima pemberitahuan pesan.

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

bergabung

Peraturanjoin()fungsi digunakan untuk menunggu thread untuk keluar dan merebut kembali sumber daya sistem.

PeraturanThreadRetobjekberisi data tentang hasil pelaksanaan.

  • id: ID benang.
  • diakhiri: Apakah benang dipaksa untuk berakhir.
  • elapsed: Waktu berjalan benang dalam nanodetik.
  • ret: Nilai yang dikembalikan dari fungsi thread.

ThreadRetobjek

Bergabunglah. bergabung (timeout)

Peraturantimeoutparameter digunakan untuk mengatur timeout dalam milidetik untuk menunggu thread untuk selesai.timeoutparameter diatur ke 0 atautimeoutparameter tidak diatur,join()fungsi akan memblokir dan menunggu sampai thread selesai menjalankan.timeoutParameter diatur menjadi -1,join()Fungsi akan segera kembali.

timeout palsu Nomor

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

Ujilahjoin()fungsi untuk timeout dan output nilai kembali.

Peraturanjoin()fungsi waktu keluar dan kembaliundefined.

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

mengakhiri

Peraturanterminate()fungsi digunakan untuk memaksa mengakhiri thread dan melepaskan sumber daya perangkat keras yang digunakan oleh thread yang dibuat.

mengakhiri ((()

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

Mengakhiri eksekusi thread secara paksa Setelah mengakhiri thread secara paksa, tidak akan ada output dari thread ini di log.

Untuk benang yang diakhiri dengan paksa olehterminate()fungsi, kita tidak bisa lagi menggunakanjoin()fungsi untuk menunggu mereka untuk mengakhiri.

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

PeraturangetData()fungsi digunakan untuk mengakses variabel yang tercatat dalam lingkungan thread. data yang valid ketika thread belum menjalankanjoin()fungsi (menunggu keberhasilan keluar) dan belum melaksanakanterminate()fungsi (mengakhiri benang secara paksa).

PeraturangetData()fungsi mengembalikan nilai kunci yang sesuai dengankeyparameter dalam pasangan nilai kunci yang disimpan dalam konteks thread saat ini.

string, number, bool, object, array, null value dan jenis lain yang didukung oleh sistem

getData ((() getData (kunci)

Peraturankeyparameter adalah nama kunci dari pasangan kunci-nilai yang disimpan.

kunci benar string

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

Catat nilai kuncicountdalam lingkungan thread bersamaan, dan kemudian membaca nilai kunci daricountdi benang utama.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}

setData

PeraturansetData()fungsi digunakan untuk menyimpan variabel dalam konteks thread.

setData ((kunci, nilai)

PeraturankeyParameter digunakan untuk menentukan nama kunci dari pasangan kunci-nilai yang disimpan.

kunci benar string PeraturanvalueParameter digunakan untuk menentukan nilai kunci dari pasangan kunci-nilai yang disimpan.

nilai benar Setiap jenis yang didukung oleh sistem, seperti string, angka, bool, objek, array, fungsi, nilai nol, dll.

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

Atur pasangan kunci-nilai di thread paralel dan baca pasangan kunci-nilai di thread utama.

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

Ini mendukung key-value passing ke dalam fungsi.

Data yang valid ketika thread belum dijalankanjoin()fungsi (menunggu keberhasilan keluar) dan belum melaksanakanterminate()fungsi (mengakhiri thread secara paksa). Nilai parametervalueharus menjadi variabel yang dapat diserialisasikan.

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

Peraturanid()fungsi digunakan untuk mengembalikanthreadIddari instansi objek multithreaded saat ini.

Nilai pengembalianid()fungsi adalahthreadId.

nomor

id()

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

Buat thread yang berjalan bersamaan dan outputthreadIddari thread paralel ini di thread utama.

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

nama

Peraturanname()fungsi digunakan untuk mengembalikan nama contoh objek multithreaded saat ini.

Peraturanname()fungsi mengembalikan nama thread bersamaan.

string

nama (()

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

Buat thread paralel dan keluarkan nama thread paralel di thread utama.

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

eventLoop

PeraturaneventLoop()fungsi digunakan untuk mendengarkan untuk acara yang diterima oleh thread.

PeraturaneventLoop()fungsi mengembalikan informasi peristiwa yang diterima oleh thread saat ini. LihatStruktur Informasi Acara.

objek, nilai nol

eventLoop (() eventLoop (timeout)

Parametertimeoutadalah pengaturan timeout dalam milidetik Jika parametertimeoutjika set menjadi 0, akan menunggu suatu peristiwa terjadi sebelum kembali. jika lebih besar dari 0, akan mengatur event waiting timeout. jika kurang dari 0, akan mengembalikan event terbaru segera.

timeout palsu Nomor

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

Mengeksekusi tiga thread secara bersamaan dan keluarkan informasi peristiwa yang diterima.

Mekanisme pemrosesaneventLoop()fungsi sama dengan fungsi globalEventLoop().

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

ThreadLock

Objek kunci thread, digunakan untuk pemrosesan sinkronisasi multi-thread.

mendapatkan

Peraturanacquire()Fungsi digunakan untuk meminta kunci benang (lock).

mendapatkan ((()

Silakan lihatthreading.Lock()bagian untuk contoh.

Peraturanacquire()Fungsi ini digunakan untuk meminta kunci thread.acquire()fungsi dari objek thread lock, ia mencoba untuk memperoleh kunci. Jika kunci saat ini tidak dipegang oleh thread lain, thread yang memanggil berhasil memperoleh kunci dan melanjutkan eksekusi. Jika kunci sudah dipegang oleh thread lain, thread yang memanggilacquire()akan diblokir sampai kunci dilepaskan.

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

Pembebasan

Peraturanrelease()fungsi digunakan untuk melepaskan kunci benang (membuka).

Pembebasan (((

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

Pengujian skenario kebuntuan

Perlu dicatat bahwa penggunaan kunci benang yang tidak tepat dapat menyebabkan kebuntuan.

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

ThreadEvent

Objek acara, digunakan untuk pemberitahuan dan sinyal acara multi-threaded.

set

Peraturanset()fungsi digunakan untuk memberi tahu peristiwa (set sinyal).

Set (()

Silakan lihatthreading.Event()bagian untuk contoh.

Jika sinyal telah diatur menggunakanset()Kita harus membersihkan sinyal dan mengaturnya lagi.

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

jelas

Peraturanclear()Fungsi digunakan untuk membersihkan sinyal.

jelas.

Silakan lihatthreading.Event()bagian untuk contoh.

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

Tunggu.

Peraturanwait()fungsi digunakan untuk mengatur acara (sinyal) menunggu, dan akan memblokir sebelum acara (sinyal) ditetapkan; mendukung pengaturan parameter timeout.

Peraturanwait()fungsi mengembalikan apakah timeout telah terjadi. Jika demikian, mengembalikan nilai benar.

bool

Tunggu. Tunggu (timeout)

PeraturantimeoutParameter digunakan untuk mengatur waktu tunggu dalam milidetik.

timeout palsu Nomor

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

Uji nilai kembali dariwait() function.

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

isSet

PeraturanisSet()fungsi digunakan untuk menentukan apakah suatu peristiwa (sinyal) telah ditetapkan.

PeraturanisSet()fungsi mengembalikan apakah acara (sinyal) telah ditetapkan; jika acara (sinyal) telah ditetapkan, mengembalikan nilai benar.

bool

isSet()

Silakan lihatthreading.Event()bagian untuk contoh.

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

ThreadKondisi

Objek kondisi, digunakan untuk sinkronisasi multi-thread.

Beritahu

Peraturannotify()fungsi digunakan untuk membangunkan thread menunggu (jika ada).wait()metode akan terbangun.

Berikan pemberitahuan

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

Gunakannotify()fungsi untuk membangunkan benang menunggu.

Peraturannotify()fungsi membangkitkan thread di antrian menunggu.

Ketikanotify()fungsi membangunkan benang, benang akan mendapatkan kembali kunci benang.

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

Kabari Semua

PeraturannotifyAll()Fungsi membangunkan semua thread yang menunggu.

Kabarkan Semua

Silakan lihatThreadCondition.notify()bagian untuk contoh.

PeraturannotifyAll()fungsi membangkitkan semua waiting threads satu per satu, dan threads terbangun mendapatkan kembali kunci thread.

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

Tunggu.

Peraturanwait()Fungsi digunakan untuk membuat benang menunggu di bawah kondisi tertentu yang dirancang.

Tunggu.

Silakan lihatThreadCondition.notify()bagian untuk contoh.

Peraturanwait()Fungsi melepaskan kunci benang dan mendapatkan kembali kunci benang ketika terbangun.

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

mendapatkan

Peraturanacquire()Fungsi digunakan untuk meminta kunci benang (lock).

mendapatkan ((()

Silakan lihatThreadCondition.notify()bagian untuk contoh.

Sebelum digunakanwait(), Anda perlu meminta thread lock (lock) dari objek kondisi saat ini.

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

Pembebasan

Peraturanrelease()fungsi digunakan untuk melepaskan kunci benang (membuka).

Pembebasan (((

Silakan lihatThreadCondition.notify()bagian untuk contoh.

Setelah digunakanwait(), kita perlu untuk melepaskan thread lock (membuka) dari kondisi saat ini objek.

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

ThreadDict

Objek kamus, digunakan untuk berbagi data.

Dapatkan

Peraturanget()fungsi digunakan untuk mendapatkan nilai kunci yang tercatat dalam objek kamus.

Peraturanget()fungsi mengembalikan nilai kunci yang ditentukan olehkey parameter.

string, number, bool, object, array, null value dan jenis lain yang didukung oleh sistem

Dapatkan kunci

PeraturankeyParameter digunakan untuk menentukan nama kunci yang sesuai dengan kunci yang akan diperoleh.

kunci benar string

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

Gunakan objek acara untuk memberi tahu thread untuk membaca dan memodifikasi data.

{@fun/Threads/ThreadDict/set set}

set

Peraturanset()fungsi digunakan untuk mengatur pasangan kunci-nilai.

set (kunci, nilai)

Parameterkeydigunakan untuk mengatur nama kunci yang akan dimodifikasi.

kunci benar string Parametervaluedigunakan untuk mengatur nilai kunci yang akan dimodifikasi.

nilai benar string, number, bool, object, array, function, null value dan tipe lain yang didukung oleh sistem

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

Ini mendukung key-value passing ke dalam fungsi.

{@fun/Threads/ThreadDict/get get}

Pengaturan Jaringan Web3