Platform Perdagangan Kuantum FMZ benar-benar menyokong fungsi pelbagai benangJavaScript
strategi 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. |
Peraturanthreading
object adalah alat pengurusan multithreading global yang menyediakan fungsi seperti membuat utas serentak, kunci utas, dan objek keadaan.threading
Objek ini hanya disokong olehJavaScript
strategi bahasa.
PeraturanThread()
fungsi digunakan untuk membuat benang serentak.
PeraturanThread()
fungsi mengembalikan aThread
objek, yang digunakan untuk menguruskan benang serentak yang dicipta, komunikasi benang, dll.
Thread
objek
Thread ((func,...args) Thread ((... item)
Parameterfunc
adalah fungsi untuk pelaksanaan serentak (diterbitkan oleh rujukan), dan menyokong menyampaikan fungsi tanpa nama.func
boleh menerima pelbagai parameter, yang akan dihantar melalui...args
Oleh itu, senarai parameterfunc
perlu konsisten dengan...args
.
fungsi
betul
fungsi
Parameterarg
adalah parameter sebenar yang dihantar kepadafunc
(iaitu fungsi pelaksanaan thread serentak) apabila panggilan balik dijalankan; mungkin terdapat beberapa parameterarg
, dan senarai parameterfunc
perlu konsisten dengan...args
.
arg
palsu
rentetan, nombor, bool, objek, susunan, fungsi, nilai sifar dan jenis lain yang disokong oleh sistem
Parameteritem
adalah array yang mengandungi rujukan fungsi dan parameter mereka yang akan dijalankan secara serentak.item
parameter 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 benangfunc
telah 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}
PeraturangetThread()
fungsi digunakan untuk mendapatkan objek thread berdasarkan ID thread yang ditentukan.
PeraturangetThread()
fungsi mengembalikanThread
objek dengan threadId yang ditentukan oleh parameter
Thread
objek
getThread ((threadId)
ParameterthreadId
adalah 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}
PeraturanmainThread()
fungsi digunakan untuk mendapatkan objek benang benang utama, iaitu benang di manamain()
fungsi dalam strategi terletak.
PeraturanmainThread()
fungsi mengembalikan objek benang benang utama.
Thread
objek
mainThread()
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
DapatkanThread
objek benang utama dan outputthreadId
daripada 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}
PeraturancurrentThread()
fungsi digunakan untuk mendapatkan objek benang benang semasa.
PeraturancurrentThread()
fungsi mengembalikan objek benang benang semasa.
Thread
objek
CurrentThread ((()
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
DapatkanThread
objek benang semasa dan outputthreadId
daripada 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}
PeraturanLock()
fungsi digunakan untuk mencipta objek kunci benang.
PeraturanLock()
fungsi mengembalikan objek kunci benang.
ThreadLock
objek
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}
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.
ThreadCondition
objek
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}
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.
ThreadEvent
objek
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}
PeraturanDict()
fungsi digunakan untuk membuat objek kamus untuk lulus ke benang serentak.
PeraturanDict()
fungsi mengembalikan aThreadDict
object.
ThreadDict
objek
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()
}
BerikanThreadDict
objek 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}
Peraturanpending
fungsi 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}
Thread
objek boleh dicipta atau dikembalikan olehthreading.Thread()
, threading.getThread()
, threading.mainThread()
, danthreading.currentThread()
.
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)
Parametertimeout
adalah 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. Jikatimeout
ditetapkan kepada 0 atautimeout
parameter tidak lulus, ia bermakna bahawa proses akan menyekat dan menunggu sehingga data diterima dari saluran.timeout
Jika 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}
PeraturanpostMessage()
fungsi digunakan untuk menghantar mesej ke utas.
postMessage ((msg)
Parametermsg
adalah 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 threadpostMessage()
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}
Peraturanjoin()
fungsi digunakan untuk menunggu untuk utas untuk keluar dan mendapatkan semula sumber sistem.
PeraturanThreadRet
objekmengandungi data mengenai hasil pelaksanaan.
ThreadRet
objek
menyertai ((() join ((timeout)
Peraturantimeout
parameter digunakan untuk menetapkan masa lapang dalam mili saat untuk menunggu untuk benang untuk selesai.timeout
parameter ditetapkan kepada 0 atautimeout
parameter tidak ditetapkan,join()
fungsi akan menyekat dan menunggu sehingga benang selesai menjalankan.timeout
parameter 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}
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}
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 dengankey
parameter 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)
Peraturankey
parameter 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 kuncicount
dalam persekitaran benang serentak, dan kemudian membaca nilai kuncicount
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/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
PeraturansetData()
fungsi digunakan untuk menyimpan pembolehubah dalam konteks benang.
setData ((kunci, nilai)
Peraturankey
parameter digunakan untuk menentukan nama kunci pasangan kunci-nilai yang disimpan.
kunci
betul
senar
Peraturanvalue
parameter 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 parametervalue
mestilah 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}
Peraturanid()
fungsi digunakan untuk mengembalikanthreadId
dari 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 outputthreadId
daripada 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}
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}
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)
Parametertimeout
adalah tetapan masa lapang dalam milidetik. Jika parametertimeout
Jika 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}
Objek kunci benang, digunakan untuk pemprosesan penyegerakan pelbagai benang.
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}
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}
Objek peristiwa, digunakan untuk pemberitahuan dan isyarat peristiwa berbilang benang.
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}
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}
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)
Peraturantimeout
Parameter 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}
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}
Objek keadaan, digunakan untuk penyegerakan pelbagai benang.
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}
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}
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}
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}
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}
Objek kamus, digunakan untuk berkongsi data.
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
Peraturankey
Parameter 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}
Peraturanset()
fungsi digunakan untuk menetapkan pasangan kunci-nilai.
set (kunci, nilai)
Parameterkey
digunakan untuk menetapkan nama kunci yang akan diubah.
kunci
betul
senar
Parametervalue
digunakan 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