FMZ 量子取引プラットフォームは,実際に多スレッド機能をサポートしていますJavaScript
言語戦略をシステムの下部から導入し,以下の目的を実現します
対象物 | 指示 | コメント |
---|---|---|
スレッド | 多スレッドグローバルオブジェクト | メンバーの役割Thread , getThread , mainThread など |
スレッド | スレッドオブジェクト | メンバーの役割peekMessage , postMessage , join など |
スレッドロック | スレッドロックオブジェクト | メンバーの役割acquire , release スレッド実行関数のパラメータとしてスレッド環境に転送できます. |
ThreadEvent について | イベントオブジェクト | メンバーの役割set , clear , wait , isSet スレッド実行関数のパラメータとしてスレッド環境に転送できます. |
ThreadCondition について | 条件オブジェクト | メンバーの役割notify , notifyAll , wait , acquire , release スレッド実行関数のパラメータとしてスレッド環境に転送できます. |
ThreadDict について | 辞書オブジェクト | メンバーの役割get , set スレッド実行関数のパラメータとしてスレッド環境に転送できます. |
についてthreading
object は,同時スレッド,スレッドロック,および条件オブジェクトを作成する機能を提供するグローバルマルチスレッド管理ツールです.このセクションでは,Stream のメンバー関数を紹介します.threading
このオブジェクトは,このオブジェクトのみがサポートされていますJavaScript
言語戦略
についてThread()
この関数は同時スレッドを作成するために使用されます.
についてThread()
a を返しますThread
作成された同時スレッド,スレッド通信などを管理するために使用されるオブジェクト.
Thread
オブジェクト
スレッド (笑) スレッド (→...項目)
パラメータfunc
同期実行のための関数 (参照で渡す) で,匿名関数の渡しをサポートします.func
複数のパラメータを受け入れることができます....args
パラメータリストはfunc
必要なのは...args
.
機能
本当
機能
パラメーターarg
実行パラメータがfunc
(つまり,同時スレッド実行機能) コールバックが実行されるとき,複数のパラメータがある可能性があります.arg
, パラメータリストfunc
必要なのは...args
.
アルグ
偽り
文字列,数,ボール,オブジェクト,配列,関数,ゼロ値,システムでサポートされる他のタイプ
パラメーターitem
同期実行される関数参照とそのパラメータを含む配列である.item
パラメータを呼び出すときに送信することができます.Thread
function.
ポイント 本当 配列
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()
}
カスタム関数と匿名関数の両方の同時スレッドを作成します.
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()
}
試しにThread(...items)
連続スレッドを作成し,複数の機能を順序的に実行します.
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()
}
パラメータを同時に実行される関数に転送する機能をサポートします.
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)
}
函数文字列の転送をサポートし,同時コンピューティングのために外部ライブラリを動的にインポートすることができます.
スレッド機能func
通過したThread()
同期実行のための関数は孤立した環境で実行されるので,スレッドの外の変数は直接参照できないし,参照されたときにコンパイルが失敗する.同時に,スレッド内で他の閉じる関数への参照はサポートされません.プラットフォームが提供するすべてのAPIはスレッド内で呼び出されますが,他のユーザー定義関数は呼び出できません.
バックテストシステムとライブ取引環境をサポートする.すべての同時スレッド関連機能は,バックテストシステムでのコード互換性としてのみサポートされており,実際に同時スレッドによって実行されません.したがって,この章では繰り返されません.
{@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/threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop}
についてgetThread()
この関数は,指定されたスレッドIDに基づいてスレッドオブジェクトを取得するために使用されます.
についてgetThread()
この関数は,Thread
パラメータで指定されたthreadIdを持つオブジェクト
Thread
オブジェクト
getThread (threadId) を取得する
パラメータthreadId
パラメータを指定して対応するスレッドオブジェクトを取得します.
スレッドId 本当 番号
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())
}
指定されたスレッドオブジェクトを入力します.threadId
.
バックテストシステムとライブ取引環境をサポートします
実行され,解放された場合は,それを使用することはできません.threading.getThread(threadId)
糸のスレッドオブジェクトを得るために
{@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/threading/Dict Dict}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}
についてmainThread()
主糸のスレッドオブジェクト,つまりスレッドがmain()
戦略の機能が位置しています.
についてmainThread()
この関数で返されるのは 主なスレッドのスレッドオブジェクトです
Thread
オブジェクト
mainThread (メインスレッド)
function main() {
Log("The threadId of the main thread:", threading.mainThread().id())
}
持ってきてThread
主糸の物体と出力threadId
主要な糸の
function test() {
Log("Output the main thread ID in the test function:", threading.mainThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
メインスレッドのスレッドオブジェクトは,並行スレッドでも得ることができる.
バックテストシステムとライブ取引環境をサポートします
{@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/currentThread currentThread}, {@fun/Threads/threading/threading/Lock Lock}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threads/threading/eventLoop}
についてcurrentThread()
この関数は,現在のスレッドのスレッドオブジェクトを取得するために使用されます.
についてcurrentThread()
この関数は,現在のスレッドのスレッドオブジェクトを返します.
Thread
オブジェクト
currentThread (現在のスレッド)
function test() {
Log("Id of the current thread:", threading.currentThread().id())
}
function main() {
var t1 = threading.Thread(test)
t1.join()
}
持ってきてThread
電流の糸の対象と出力threadId
ロープの流れを
バックテストシステムとライブ取引環境をサポートします
{@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Dict Dict}, {@fun/Threads/threading/threading/eventLoop}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop eventLoop}, {@fun/Threads/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/
についてLock()
この関数はスレッドロックオブジェクトを作成するために使用されます.
についてLock()
この関数はスレッドロックオブジェクトを返します.
ThreadLock
オブジェクト
鍵を閉めろ
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()
}
2つの同時スレッドが共通のリソースにアクセスします.
バックテストシステムとライブ取引環境をサポートします
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threads/threading/Thread Thread}, {@fun/Threads/threads/threading/condition Condition}, {@fun/Threads/threads/threading/event Event}, {@fun/Threads/threads/threading/mainThread mainThread}, {@fun/Threads/threads/threading/currentThread currentThread}, {@fun/Threads/threads/threading/threads/threading/threadThreadThread}, {@fun/Threads/threads/threads/threads/threads/eventLoopイベント}, {@fun/Threads/threads/threads/thre
についてCondition()
条件変数オブジェクトを作成するために使用され,複数のスレッドの同時環境におけるスレッド間の同期と通信を達成するために使用されます.Condition()
特定の条件が満たされていない場合,スレッドが他のスレッドが条件が満たされていることを通知するまで待つことができます.
についてCondition()
a を返しますThreadCondition
object.
ThreadCondition
オブジェクト
条件
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()
}
2つの同時スレッドが共通のリソースにアクセスします.
バックテストシステムは この機能を実装しません ただ定義します
{@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/threads/mainThread mainThread}, {@fun/Threads/threads/threading/currentThread currentThread}, {@fun/Threads/threads/threads/threading/Loop lock}, {@fun/Threads/threads/threads/eventLoop}, {@fun/Threads/threads/threads/threading/eventLoop}, {@fun/Threads/threads/th
についてEvent()
この関数は,スレッドイベントスレッド間の同期に使用されるオブジェクトで,スレッドが別のスレッドからの通知またはシグナルを待つことができます.
についてEvent()
a を返しますThreadEvent
object.
ThreadEvent
オブジェクト
イベント
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()
}
2つの同時スレッドが共通のリソースにアクセスします.
バックテストシステムとライブ取引環境をサポートします
{@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/threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threads/threading/eventLoop 事件終了}
についてDict()
この関数は,並行スレッドに転送するための辞書オブジェクトを作成するために使用されます.
についてDict()
a を返しますThreadDict
object.
ThreadDict
オブジェクト
暗記する
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()
}
正規オブジェクトを同時スレッド実行関数に転送し,オブジェクトのキー値を修正すると,他のスレッドのオブジェクトのキー値が変更されるかどうかをテストします.
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()
}
渡してThreadDict
作成されたオブジェクトDict()
動作を同時スレッド実行機能に変換し,オブジェクトのキー値を変更すると,他のスレッドのオブジェクトのキー値が変化するかどうかをテストします.
共通のオブジェクトが並行スレッド関数に渡されたとき,それはディープコピーとして渡されます.並行スレッドのキー値を修正すると,他のスレッドの辞書に影響しません.
バックテストシステムとライブ取引環境をサポートします
{@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/threading/eventLoop}
についてpending
この関数は,現在の戦略プログラムで実行されている並行スレッドの数を得るのに使用されます.
についてpending()
この関数は,現在の戦略プログラムが実行している並行スレッドの数を返します.
番号
待機している
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())
}
2つの同時実行スレッドを作成して,pending()
異なる時間ノードで機能します.
戦略がmain()
実行を開始し,関数を呼び出す.pending()
戦略が実行されている主なスレッドであるため,main()
機能が位置している場合も 待機しているスレッドです
バックテストシステムとライブ取引環境をサポートします
{@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/threads/threading/Dict Dict}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/threading/eventLoop}, {@fun/Threads/threads/threading/eventLoop}, {@fun/Threads/threads/threads/threading/threading/threadLoop}
Thread
作成または返却することができます.threading.Thread()
, threading.getThread()
, threading.mainThread()
そしてthreading.currentThread()
.
についてpeekMessage()
この関数はスレッドからメッセージを受け取るのに使われます
についてpeekMessage()
この関数は,現在のスレッドオブジェクトに関連付けられたスレッドが受信したメッセージを返します.
文字列,数,ボール,オブジェクト,配列,ゼロ値,システムでサポートされる他のタイプ
peekMessage (メッセージ) peekMessage (タイムアウト)
パラメータtimeout
timeout の設定です. パラメータによって設定されたミリ秒の数をブロックして待ち,データを返します. データがない場合,タイムアウトが限界を超えると, null 値が返されます.timeout
0 に設定されているか,timeout
プロセスがブロックされ,チャネルからデータが受信されるまで待つことを意味します.timeout
−1に設定された場合,プロセスはデータをブロックし,すぐに返却しないことを意味します.データがない場合は,ゼロ値が返されます.
タイムアウト 偽り 番号
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()
}
同期スレッドからメインスレッドにメッセージを送信します.
プログラムを書くとき スレッド・デッドロックの問題に 注意を払う必要があります
{@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/join name}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/event
についてpostMessage()
この関数はスレッドにメッセージを送信するために使用されます.
postMessage ((msg) について
パラメータmsg
メッセージを送信します
メッセージ 本当 文字列,数,ボール,オブジェクト,配列,関数,ゼロ値など,システムでサポートされる任意のタイプ
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()
}
同期スレッドでメッセージを送信し,使用するeventLoop()
メッセージの通知を受け取る
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()
}
函数を送信もサポートします
実行関数に呼び出します.postMessage()
メッセージ イベントも生成されます.eventLoop()
メッセージ通知を受信する機能
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Threads/id id}, {@fun/Threads/Threads/Threads/name name}, {@fun/Threads/Thread/eventLoop eventLoop}
についてjoin()
この機能はスレッドが終了してシステムリソースを回収するのを待つために使用されます.
についてThreadRet
オブジェクト実行結果に関するデータを含みます.その属性には以下が含まれます:
ThreadRet
オブジェクト
加入する 加入 (タイムアウト)
についてtimeout
スレッドが終了するのを待つためのミリ秒でタイムアウトを設定するために使用されます.timeout
パラメータが0に設定されているかtimeout
パラメータが設定されていない場合,join()
実行が完了するまで待つ.timeout
パラメータが -1 に設定され,join()
機能がすぐに戻ります
タイムアウト 偽り 番号
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}
}
試験するjoin()
タイムアウトの関数と返却値を出力します
についてjoin()
関数 out と return の時間undefined
.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/Thread/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop eventLoop
についてterminate()
この機能はスレッドを強制的に終了し,作成したスレッドが使用するハードウェアリソースを解放するために使用されます.
終了する
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)
}
}
スレッドの実行を強制的に終了します. スレッドを強制的に終了した後,ログにこのスレッドからの出力はありません.
糸が強要的に切断される場合terminate()
機能,我々はもはや使用することはできませんjoin()
機能が終了するのを待つことです
{@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/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop event
についてgetData()
この関数はスレッド環境で記録された変数にアクセスするために使用されます.スレッドが実行していない場合,データは有効です.join()
実行していない場合terminate()
機能 (糸を強制的に切る)
についてgetData()
この関数は,この関数に対応するキー値を返します.key
現在のスレッドコンテキストに格納されたキー値ペアのパラメータです.
文字列,数,ボール,オブジェクト,配列,ゼロ値,システムでサポートされる他のタイプ
getData (データ取得) getData (キー) を取得する
についてkey
パラメータは,保存されたキー値ペアのキー名です.
キー 本当 文字列
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()
}
鍵の値を記録するcount
鍵値を読み取ることができます.count
主要な話題です
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name name}, {@fun/Threads/Thread/thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads
についてsetData()
この関数はスレッドコンテキスト内の変数を保存するために使用されます.
setData (キー,値)
についてkey
パラメータは,保存されたキー値ペアのキー名を指定するために使用されます.
キー
本当
文字列
についてvalue
パラメータは,保存されたキー値ペアのキー値を指定するために使用されます.
価値 本当 文字列,数,ボール,オブジェクト,配列,関数,ゼロ値など,システムでサポートされる任意のタイプ
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Sleep(1000)
Log(`t1.getData("data"):`, t1.getData("data"))
t1.join()
}
同行スレッドにキー値ペアを設定し メインスレッドにキー値ペアを読み取ります
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()
}
鍵値が関数に変換されるのをサポートします.
このスレッドが実行していない場合,このデータは有効です.join()
実行していない場合terminate()
パラメータの値value
シリアル化可能な変数でなければならない.
{@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/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop eventLoop
についてid()
この関数で,threadId
複数のスレッドのオブジェクトのインスタンスの
返金値がid()
機能はthreadId
.
番号
id()
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}
同期で実行するスレッドを作成して出力しますthreadId
この同時進行糸がメイン糸に
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Threads/setData set}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/
についてname()
この関数は,現在のマルチスレッドオブジェクトインスタンスの名前を返します.
についてname()
この関数は,同時スレッド名を返します.
文字列
氏名
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}
同期スレッドを作成し,メインスレッドで同期スレッドの名前を出力します.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Threads/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop}, {@fun/Threads/thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Th
についてeventLoop()
この機能はスレッドが受信したイベントを聞くために使用されます.
についてeventLoop()
この関数は,現在のスレッドが受信したイベント情報を返します.イベント情報構造.
オブジェクト,ゼロ値
イベントループ イベントループ (タイムアウト)
パラメータtimeout
パラメータが設定されている場合timeout
値が0に設定されている場合,帰還する前にイベントが起こるのを待つ.値が0を超えると,イベントの待機タイムアウトを設定します.値が0未満の場合,最新のイベントを直ちに返します.
タイムアウト 偽り 番号
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()
}
3つのスレッドを同時に実行し,受信されたイベント情報を出力します.タイムアウトが発生するか,関数がすぐに返される場合は,出力値は null です.
処理メカニズムはeventLoop()
この関数は,この関数と同じです.EventLoop()
.
{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Threads/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Threads/Thread/name name}, {@fun/Threads/name id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/name name}, {@fun/Threads/Threads/name name}, {@fun/Threads/Threads/data set}, {@fun/Threads/Threads/id id}, {@fun/Threads/threads/name name}, {@
複数のスレッドの同期処理に使用されるスレッドロックオブジェクト
についてacquire()
機能はスレッドロック (ロック) を要求するために使用されます.
取得する
参照してくださいthreading.Lock()
例のセクションです
についてacquire()
スレッドロックを要求するために使用されます. スレッドがスレッドロックを呼び出すとき,acquire()
スレッドロックオブジェクトの関数は,スレッドロックを取得しようとします.もしスレッドロックが別のスレッドによって現在保持されていない場合,呼び出しスレッドはロックを成功裏に取得し,実行を続けます.もしスレッドロックが既に別のスレッドによって保持されている場合,スレッドコールacquire()
鍵が解けられるまで ブロックされます
{@fun/Threads/threading/Lock Lock} {@fun/Threads/ThreadLock/release release} {@fun/threads/threads/threading/lock lock} {@fun/threads/threads/threads/threading/lock lock} {@fun/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads}
についてrelease()
機能はスレッドロックを解き放つために使われます.
解放する
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()
}
デッドロックシナリオのテスト
線鎖の不適切な使用は,行き詰まりにつながる可能性があることに注意してください.
{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire} ローックロック
複数のスレッドのイベント通知と信号に使用されるイベントオブジェクト.
についてset()
機能はイベント (セット信号) を通知するために使用されます.
セット
参照してくださいthreading.Event()
例のセクションです
信号が設定されている場合set()
信号を消して再設定する
{@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/Threads/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/thread
についてclear()
信号をクリアするために使用されます.
分かりました.
参照してくださいthreading.Event()
例のセクションです
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/Threads/Threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/thre
についてwait()
この機能は,イベント (信号) の待機を設定するために使用され,イベント (信号) が設定される前にブロックされます.タイムアウトパラメータを設定することをサポートします.
についてwait()
timeout が発生したかどうかを返します.そうであれば true 値を返します.
ボール
待って 待って (タイムアウト)
についてtimeout
パラメータは,待機タイムアウトをミリ秒で設定するために使用されます.
タイムアウト 偽り 番号
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()
}
返回値をテストするwait()
function.
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/ThreadEvent/isSet isSet}, {@fun/Threads/Threads/ThreadEvent/clear clear}, {@fun/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/Threads/Threads/isSet isSet}, {@fun/Threads/Threads/Threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads
についてisSet()
この関数は,イベント (信号) が設定されているかどうかを判断するために使用されます.
についてisSet()
この関数は,イベント (信号) が設定されているかどうかを返します.もしイベント (信号) が設定されている場合は,true値を返します.
ボール
isSet (セット)
参照してくださいthreading.Event()
例のセクションです
{@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/set set}, {@fun/Threads/ThreadEvent/clear clear}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/ThreadEvent/wait wait}, {@fun/Threads/Threads/ThreadEvent/set set}, {@fun/Threads/Threads/ThreadEvent/clear clear}, {@fun/Threads/Threads/Wait wait}, {@fun/Threads/Threads/Wait wait}, {@fun/Threads/Threads/threads/threads/wait}, {@fun/threads/threads/
条件オブジェクト,マルチスレッド同期に使用されます.
についてnotify()
呼び出したスレッドのみです.wait()
方法が目覚めるでしょう
通知する
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)
}
}
試しにnotify()
待機糸を目覚めさせる機能です
についてnotify()
待機列のスレッドを起こします
その時にnotify()
糸がスレッドロックに戻ります
{@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/ThreadCondition/threadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/threads/threadCondition/release release}, {@fun/threads/threadCondition/release release release}, {@fun/threads/threadCondition/release release
についてnotifyAll()
待機するスレッドをすべて起こします.
全員に知らせる
参照してくださいThreadCondition.notify()
例のセクションです
についてnotifyAll()
起き上がったスレッドがスレッドロックを再獲得します 起き上がったスレッドがスレッドロックを再獲得します
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/thread release}, {@fun/threads/threadCondition/thread release release}, {@fun/threads/threadCondition/thread release release}, {@fun/threads/threadCondition/thread release release}, {@fun/threads/threadCondition/thread release release release}, {@fun/threads/threadCondition/thread release release release release}, {@fun/threads/threadCondition/thread
についてwait()
特定の設計条件下でスレッドを待機させる機能です
待って
参照してくださいThreadCondition.notify()
例のセクションです
についてwait()
機能はスレッドロックを解放し,目覚めるとスレッドロックを再獲得します.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}, {@fun/ThreadCondition/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/Threads/ThreadCondition/release release}, {@fun/Threads/ThreadCondition/release release}, {@fun/threads/threadCondition/release release}, {@fun/threads/threadCondition/release release release}, {@fun/threads
についてacquire()
機能はスレッドロック (ロック) を要求するために使用されます.
取得する
参照してくださいThreadCondition.notify()
例のセクションです
使用前wait()
ロープのロック (ロック) を要求する必要があります.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/ThreadCondition/ThreadCondition/release release}, {@fun/ThreadCondition/ThreadCondition/release release}, {@fun/ThreadCondition/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/release release}, {@fun/ThreadCondition/threadCondition/release release}, {@fun/threadCondition/threadCondition/release release}, {@threadCondition/threadCondition/release release release}, {@fun/threadCondition/threadCondition/release release release}, {@fun/thread
についてrelease()
機能はスレッドロックを解き放つために使われます.
解放する
参照してくださいThreadCondition.notify()
例のセクションです
使用後wait()
ロープを解き放つ必要があります. ロープを解き放つ必要があります.
{@fun/Threads/ThreadCondition/notify notify}, {@fun/Threads/ThreadCondition/notifyAll notifyAll}, {@fun/Threads/ThreadCondition/wait wait}, {@fun/Threads/ThreadCondition/acquire acquire}, {@fun/ThreadCondition/threadCondition/acquire acquire}, {@fun/ThreadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition}, {@fun/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/threadCondition/acquire
辞書オブジェクト,データ共有に使用されます.
についてget()
辞書オブジェクトに記録されたキー値を取得するために使用されます.
についてget()
鍵の値を返しますkey
parameter.
文字列,数,ボール,オブジェクト,配列,ゼロ値,システムでサポートされる他のタイプ
get (キー)
についてkey
パラメータは取得するキーに対応するキー名を指定するために使用されます.
キー 本当 文字列
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"))
}
イベントオブジェクトを使用してスレッドにデータを読み取り,修正するように通知します.
{@fun/Threads/ThreadDict/セットセット}
についてset()
鍵値ペアを設定するために使用されます.
セット (キー,値)
パラメータkey
変更するキー名を設定するために使用されます.
キー
本当
文字列
パラメーターvalue
変更するキー値を設定するために使用されます.
価値 本当 文字列,数,ボール,オブジェクト,配列,関数,ゼロ値,システムでサポートされる他のタイプ
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()
}
鍵値が関数に変換されるのをサポートします.
{@fun/Threads/ThreadDict/get get} 楽しいこと
ネットワーク設定 ウェブ3