Sumber dimuat naik... memuat...

Benang

Platform Perdagangan Kuantum FMZ benar-benar menyokong fungsi pelbagai benangJavaScriptstrategi bahasa dari bawah sistem, dan melaksanakan objektif berikut:

Objek Arahan Catatan
Penggelek Objek global berbilang benang Fungsi ahli:Thread, getThread, mainThread, dan lain-lain
Benang Objek benang Fungsi ahli:peekMessage, postMessage, join, dan lain-lain
ThreadLock Objek kunci benang Fungsi ahli:acquire, release. Mereka boleh dihantar ke persekitaran benang sebagai parameter fungsi pelaksanaan benang.
ThreadEvent Objek peristiwa Fungsi ahli:set, clear, wait, isSet. Mereka boleh dihantar ke dalam persekitaran benang sebagai parameter fungsi pelaksanaan benang.
ThreadCondition Objek keadaan Fungsi ahli:notify, notifyAll, wait, acquire, release. Mereka boleh dihantar ke dalam persekitaran benang sebagai parameter fungsi pelaksanaan benang.
ThreadDict Objek kamus Fungsi ahli:get, set. Mereka boleh dihantar ke persekitaran benang sebagai parameter fungsi pelaksanaan benang.

Penggelek

Peraturanthreadingobject adalah alat pengurusan multithreading global yang menyediakan fungsi seperti membuat utas serentak, kunci utas, dan objek keadaan.threadingObjek ini hanya disokong olehJavaScriptstrategi bahasa.

Benang

PeraturanThread()fungsi digunakan untuk membuat benang serentak.

PeraturanThread()fungsi mengembalikan aThreadobjek, yang digunakan untuk menguruskan benang serentak yang dicipta, komunikasi benang, dll.

Threadobjek

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

Parameterfuncadalah fungsi untuk pelaksanaan serentak (diterbitkan oleh rujukan), dan menyokong menyampaikan fungsi tanpa nama.funcboleh menerima pelbagai parameter, yang akan dihantar melalui...argsOleh itu, senarai parameterfuncperlu konsisten dengan...args.

fungsi betul fungsi Parameterargadalah parameter sebenar yang dihantar kepadafunc(iaitu fungsi pelaksanaan thread serentak) apabila panggilan balik dijalankan; mungkin terdapat beberapa parameterarg, dan senarai parameterfuncperlu konsisten dengan...args.

arg palsu rentetan, nombor, bool, objek, susunan, fungsi, nilai sifar dan jenis lain yang disokong oleh sistem Parameteritemadalah array yang mengandungi rujukan fungsi dan parameter mereka yang akan dijalankan secara serentak.itemparameter boleh dihantar dalam apabila memanggilThread function.

item betul 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 utas serentak untuk kedua-dua fungsi tersuai dan fungsi tanpa nama.

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 mencipta benang serentak dan melaksanakan pelbagai 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()
}

Ia menyokong lulus parameter kepada fungsi yang dijalankan secara serentak.

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

Ia menyokong lulus dalam rentetan fungsi dan boleh mengimport perpustakaan luaran secara dinamik untuk pengkomputeran serentak.

Fungsi benangfunctelah diteruskan ke dalamThread()fungsi untuk pelaksanaan serentak berjalan dalam persekitaran yang terpencil, jadi pembolehubah di luar benang tidak boleh dirujuk secara langsung, dan penyusunan akan gagal apabila dirujuk. Pada masa yang sama, rujukan kepada fungsi penutupan lain tidak disokong dalam benang. Semua API yang disediakan oleh platform boleh dipanggil dalam benang, tetapi fungsi lain yang ditakrifkan pengguna tidak boleh dipanggil.

Ia menyokong sistem backtesting dan persekitaran perdagangan langsung. Semua fungsi yang berkaitan dengan thread serentak hanya disokong sebagai keserasian kod dalam sistem backtesting dan tidak akan dilaksanakan oleh thread serentak, jadi mereka tidak akan diulangi 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 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 sepadan dengan menentukan parameter.

ThreadId betul nombor

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 benang yang ditentukan melaluithreadId.

Ia menyokong sistem backtesting dan persekitaran perdagangan langsung.

Jika benang yang anda ingin mendapatkan telah dijalankan dan dikeluarkan, anda tidak boleh 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 benang utama, iaitu benang di manamain()fungsi dalam strategi terletak.

PeraturanmainThread()fungsi mengembalikan objek benang benang utama.

Threadobjek

mainThread()

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

DapatkanThreadobjek benang utama dan outputthreadIddaripada 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 benang utama juga boleh diperoleh dalam benang serentak.

Ia menyokong sistem backtesting dan persekitaran 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/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/eventLoop Loop}

Thread semasa

PeraturancurrentThread()fungsi digunakan untuk mendapatkan objek benang benang semasa.

PeraturancurrentThread()fungsi mengembalikan objek benang benang semasa.

Threadobjek

CurrentThread ((()

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

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

DapatkanThreadobjek benang semasa dan outputthreadIddaripada benang semasa.

Ia menyokong sistem backtesting dan persekitaran perdagangan langsung.

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

Kunci

PeraturanLock()fungsi digunakan untuk mencipta objek kunci benang.

PeraturanLock()fungsi mengembalikan objek kunci benang.

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 benang serentak mengakses sumber yang sama.

Ia menyokong sistem backtesting dan persekitaran 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}

Keadaan

PeraturanCondition()fungsi digunakan untuk membuat objek pembolehubah keadaan, yang digunakan untuk mencapai penyegerakan dan komunikasi antara benang dalam persekitaran serentak berbilang benang.Condition(), benang boleh menunggu apabila keadaan tertentu tidak dipenuhi sehingga benang lain memaklumkan bahawa keadaan telah dipenuhi.

PeraturanCondition()fungsi mengembalikan aThreadCondition object.

ThreadConditionobjek

Keadaan

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 benang serentak mengakses sumber yang sama.

Sistem backtesting tidak melaksanakan fungsi ini, ia hanya mentakrifkannya.

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

Acara

PeraturanEvent()fungsi digunakan untuk menciptaperistiwa benangobjek, yang digunakan untuk menyegerakkan antara utas, membolehkan satu utas menunggu pemberitahuan atau isyarat dari utas 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 benang serentak mengakses sumber yang sama.

Ia menyokong sistem backtesting dan persekitaran perdagangan langsung.

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

Dikt

PeraturanDict()fungsi digunakan untuk membuat objek kamus untuk lulus ke benang serentak.

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

Memindahkan objek biasa ke fungsi pelaksanaan utas serentak untuk menguji sama ada mengubah suai nilai kunci objek akan menyebabkan perubahan nilai kunci objek di utas 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 dicipta olehDict()fungsi kepada fungsi pelaksanaan utas serentak, dan menguji sama ada mengubah suai nilai kunci objek akan menyebabkan nilai kunci objek dalam utas lain berubah.

Apabila objek biasa diteruskan ke fungsi utas serentak, ia diteruskan sebagai salinan mendalam.

Ia menyokong sistem backtesting dan persekitaran 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/pending pending}, {@fun/Threads/threading/eventLoop}

menunggu

Peraturanpendingfungsi digunakan untuk mendapatkan bilangan benang serentak yang berjalan dalam program strategi semasa.

Peraturanpending()fungsi mengembalikan bilangan benang serentak bahawa program strategi semasa sedang berjalan.

nombor

masih belum selesai.

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 benang yang berjalan serentak dan panggilpending()fungsi pada nod masa yang berbeza.

Apabila strategimain()fungsi mula berjalan, memanggil fungsipending()langsung akan kembali 1, kerana benang utama di mana strategimain()fungsi terletak juga benang menunggu.

Ia menyokong sistem backtesting dan persekitaran 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 boleh dicipta atau dikembalikan olehthreading.Thread(), threading.getThread(), threading.mainThread(), danthreading.currentThread().

PeekMessage

PeraturanpeekMessage()fungsi digunakan untuk mendapatkan mesej dari utas.

PeraturanpeekMessage()fungsi mengembalikan mesej yang diterima oleh utas yang dikaitkan dengan objek utas semasa.

rentetan, nombor, bool, objek, susunan, nilai sifar dan jenis lain yang disokong oleh sistem

PeekMessage() peekMessage ((timeout)

Parametertimeoutadalah tetapan masa lapang. Ia akan menyekat dan menunggu bilangan milidetik yang ditetapkan oleh parameter dan mengembalikan data. Jika tidak ada data dan masa lapang melebihi had, nilai sifar akan dikembalikan. Jikatimeoutditetapkan kepada 0 atautimeoutparameter tidak lulus, ia bermakna bahawa proses akan menyekat dan menunggu sehingga data diterima dari saluran.timeoutJika set kepada -1, ia bermaksud bahawa proses tidak akan menyekat dan mengembalikan data dengan segera. Jika tidak ada data, nilai null akan dikembalikan.

masa lapang palsu nombor

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

Hantar mesej ke thread utama dari thread serentak.

Apabila menulis program, kita perlu memberi perhatian kepada 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}

postMesej

PeraturanpostMessage()fungsi digunakan untuk menghantar mesej ke utas.

postMessage ((msg)

Parametermsgadalah mesej yang akan dihantar.

msg betul Mana-mana jenis yang disokong oleh sistem, seperti rentetan, nombor, bool, objek, array, fungsi, nilai sifar, 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()
}

Hantar mesej dalam utas serentak dan gunakaneventLoop()untuk menerima pemberitahuan mesej.

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

Ia menyokong menghantar fungsi.

Apabila fungsi pelaksanaan thread memanggilpostMessage()fungsi untuk menghantar isyarat atau data, peristiwa mesej juga dihasilkan.eventLoop()fungsi untuk menerima pemberitahuan mesej.

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

menyertai

Peraturanjoin()fungsi digunakan untuk menunggu untuk utas untuk keluar dan mendapatkan semula sumber sistem.

PeraturanThreadRetobjekmengandungi data mengenai hasil pelaksanaan.

  • id: ID benang.
  • Ditamatkan: Sama ada benang dipaksa untuk berakhir.
  • telah berlalu: Masa berjalan benang dalam nanodetik.
  • ret: Nilai pulangan fungsi benang.

ThreadRetobjek

menyertai ((() join ((timeout)

Peraturantimeoutparameter digunakan untuk menetapkan masa lapang dalam mili saat untuk menunggu untuk benang untuk selesai.timeoutparameter ditetapkan kepada 0 atautimeoutparameter tidak ditetapkan,join()fungsi akan menyekat dan menunggu sehingga benang selesai menjalankan.timeoutparameter ditetapkan kepada -1,join()Fungsi akan kembali dengan segera.

masa lapang palsu nombor

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

Ujijoin()fungsi untuk masa lapang dan output nilai pulangan.

Peraturanjoin()fungsi masa 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 menamatkan thread dan melepaskan sumber perkakasan yang digunakan oleh thread yang dicipta.

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

Menamatkan pelaksanaan thread dengan paksa. Selepas memaksa menamatkan thread, tidak akan ada output dari thread ini dalam log.

Untuk benang yang diakhiri secara paksa olehterminate()fungsi, kita tidak boleh lagi menggunakanjoin()fungsi untuk menunggu mereka untuk menamatkan.

{@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 pembolehubah yang direkodkan dalam persekitaran benang. data adalah sah apabila benang belum menjalankanjoin()fungsi (menunggu kejayaan keluar) dan tidak menjalankanterminate()fungsi (mengakhiri benang secara paksa).

PeraturangetData()fungsi mengembalikan nilai kunci yang sepadan dengankeyparameter dalam pasangan kunci-nilai yang disimpan dalam konteks thread semasa.

rentetan, nombor, bool, objek, susunan, nilai sifar dan jenis lain yang disokong oleh sistem

getData() getData (kunci)

Peraturankeyparameter adalah nama kunci pasangan kunci-nilai yang disimpan.

kunci betul senar

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

Mencatatkan nilai kuncicountdalam persekitaran benang serentak, dan kemudian membaca nilai kuncicountdalam 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 pembolehubah dalam konteks benang.

setData ((kunci, nilai)

Peraturankeyparameter digunakan untuk menentukan nama kunci pasangan kunci-nilai yang disimpan.

kunci betul senar Peraturanvalueparameter digunakan untuk menentukan nilai kunci pasangan kunci-nilai yang disimpan.

nilai betul Mana-mana jenis yang disokong oleh sistem, seperti rentetan, nombor, bool, objek, array, fungsi, nilai sifar, dll.

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

Tetapkan pasangan kunci-nilai di benang serentak dan baca pasangan kunci-nilai di benang 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()
}

Ia menyokong nilai kunci yang lulus ke fungsi.

Data adalah sah apabila benang belum dilaksanakanjoin()fungsi (menunggu kejayaan keluar) dan tidak menjalankanterminate()fungsi (mengakhiri benang secara paksa). Nilai parametervaluemestilah pembolehubah yang boleh 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}, {@fun/Threads/Thread/eventLoop eventLoop}

id

Peraturanid()fungsi digunakan untuk mengembalikanthreadIddari contoh objek multithread semasa.

Nilai pulanganid()fungsi ialahthreadId.

nombor

id()

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

Membuat benang yang berjalan serentak dan outputthreadIddaripada benang serentak ini dalam 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/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 multithread semasa.

Peraturanname()fungsi mengembalikan nama benang bersamaan.

senar

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 serentak dan keluarkan nama thread serentak dalam 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 mendengar untuk peristiwa yang diterima oleh benang.

PeraturaneventLoop()fungsi mengembalikan maklumat peristiwa yang diterima oleh thread semasa. LihatStruktur Maklumat Acara.

objek, nilai sifar

eventLoop (dalam bahasa Inggeris) eventLoop (timeout)

Parametertimeoutadalah tetapan masa lapang dalam milidetik. Jika parametertimeoutJika ia lebih besar daripada 0, ia akan menetapkan masa tunggu acara. Jika ia kurang daripada 0, ia akan mengembalikan acara terbaru dengan serta-merta.

masa lapang palsu nombor

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

Melakukan tiga benang serentak dan mengeluarkan maklumat peristiwa yang diterima. Jika masa tamat berlaku atau fungsi kembali dengan segera, nilai output adalah sifar.

Mekanisme pemprosesaneventLoop()fungsi adalah 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 benang, digunakan untuk pemprosesan penyegerakan pelbagai benang.

memperoleh

Peraturanacquire()fungsi digunakan untuk meminta kunci benang (kunci).

mendapatkan ((()

Sila rujukthreading.Lock()Bahagian untuk contoh.

Peraturanacquire()fungsi digunakan untuk meminta kunci thread.acquire()fungsi objek kunci thread, ia cuba untuk memperoleh kunci. Jika kunci tidak kini dipegang oleh utas lain, utas panggilan berjaya memperoleh kunci dan meneruskan pelaksanaan. Jika kunci sudah dipegang oleh utas lain, utas panggilanacquire()akan disekat sehingga kunci dilepaskan.

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

Pembebasan

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

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

Ujian senario buntu

Perlu diperhatikan bahawa penggunaan kunci benang yang tidak betul boleh menyebabkan kebuntuan.

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

ThreadEvent

Objek peristiwa, digunakan untuk pemberitahuan dan isyarat peristiwa berbilang benang.

set

Peraturanset()fungsi digunakan untuk memberitahu peristiwa (set isyarat).

set (()

Sila rujukthreading.Event()Bahagian untuk contoh.

Jika isyarat telah ditetapkan menggunakanset()Kita perlu membersihkan isyarat dan menetapkannya semula.

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

jelas

Peraturanclear()Fungsi digunakan untuk membersihkan isyarat.

jelas.

Sila rujukthreading.Event()Bahagian untuk contoh.

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

Tunggu.

Peraturanwait()fungsi digunakan untuk menetapkan acara (isyarat) menunggu, dan akan menyekat sebelum acara (isyarat) ditetapkan; ia menyokong menetapkan parameter timeout.

Peraturanwait()fungsi mengembalikan sama ada masa lapang telah berlaku. Jika ya, ia mengembalikan nilai benar.

bool

Tunggu. tunggu (timeout)

PeraturantimeoutParameter digunakan untuk menetapkan masa tunggu dalam mili saat.

masa lapang palsu nombor

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 pulanganwait() function.

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

isSet

PeraturanisSet()fungsi digunakan untuk menentukan sama ada peristiwa (isyarat) telah ditetapkan.

PeraturanisSet()fungsi mengembalikan sama ada acara (isyarat) telah ditetapkan; jika acara (isyarat) telah ditetapkan, ia mengembalikan nilai benar.

bool

isSet()

Sila rujukthreading.Event()Bahagian untuk contoh.

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

ThreadCondition

Objek keadaan, digunakan untuk penyegerakan pelbagai benang.

maklumkan

Peraturannotify()fungsi digunakan untuk membangunkan thread menunggu (jika ada). Hanya thread yang telah dipanggilwait()Sistem akan terbangun.

maklumkan

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 membangunkan utas dalam barisan menunggu.

Apabilanotify()Fungsi membangunkan benang, benang akan mendapatkan semula kunci benang.

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

memberitahuSemua

PeraturannotifyAll()Fungsi membangunkan semua benang menunggu.

memberitahuSemua()

Sila rujukThreadCondition.notify()Bahagian untuk contoh.

PeraturannotifyAll()Fungsi membangkitkan semua benang menunggu satu demi satu, dan benang yang dibangkitkan mendapatkan semula kunci benang.

{@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 keadaan tertentu yang direka.

Tunggu.

Sila rujukThreadCondition.notify()Bahagian untuk contoh.

Peraturanwait()Fungsi melepaskan kunci benang dan mendapatkan semula kunci benang apabila bangun.

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

memperoleh

Peraturanacquire()fungsi digunakan untuk meminta kunci benang (kunci).

mendapatkan ((()

Sila rujukThreadCondition.notify()Bahagian untuk contoh.

Sebelum digunakanwait(), anda perlu meminta kunci benang (kunci) objek keadaan semasa.

{@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 kunci).

Pembebasan ((()

Sila rujukThreadCondition.notify()Bahagian untuk contoh.

Selepas digunakanwait(), kita perlu melepaskan kunci benang (membuka kunci) objek keadaan semasa.

{@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 berkongsi data.

Dapatkan

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

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

rentetan, nombor, bool, objek, susunan, nilai sifar dan jenis lain yang disokong oleh sistem

Dapatkan kunci

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

kunci betul senar

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 peristiwa untuk memberitahu utas untuk membaca dan mengubah suai data.

{@fun/Threads/ThreadDict/set set}

set

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

set (kunci, nilai)

Parameterkeydigunakan untuk menetapkan nama kunci yang akan diubah.

kunci betul senar Parametervaluedigunakan untuk menetapkan nilai kunci yang akan diubah.

nilai betul rentetan, nombor, bool, objek, susunan, fungsi, nilai sifar dan jenis lain yang disokong 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()
}

Ia menyokong nilai kunci yang lulus ke fungsi.

{@fun/Threads/ThreadDict/get get}

Tetapan Rangkaian Web3