이threading
object는 동시 스레드, 스레드 잠금 및 조건 객체를 생성하는 등의 기능을 제공하는 글로벌 멀티 스레드 관리 도구입니다. 이 섹션에서는 스레드 관리의 구성원 기능을 소개합니다.threading
이 객체는JavaScript
언어 전략
이Thread()
함수는 동시 스레드를 생성하는 데 사용됩니다.
이Thread()
함수는 a를 반환합니다Thread
생성된 동시 스레드, 스레드 통신 등을 관리하는 데 사용되는 객체
Thread
물체
Thread ((func,...args) 스레드 (... 항목)
매개 변수func
동시에 실행되는 함수입니다 (리퍼런스에 의해 전달됩니다) 그리고 익명의 함수를 전달하는 것을 지원합니다.func
여러 매개 변수를 받아들일 수 있습니다....args
동시 실행 중입니다. 따라서,func
이 모든 것이...args
.
함수
사실
기능
매개 변수arg
실제 매개 변수가func
(즉 동시 스레드 실행 함수) 콜백이 실행될 때, 여러 매개 변수가 있을 수 있습니다.arg
, 그리고 매개 변수 목록func
이 모든 것이...args
.
아그
거짓
문자열, 숫자, bool, 객체, 배열, 함수, null 값 및 시스템에서 지원되는 다른 유형
매개 변수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/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()
함수는 지정된 스레드 ID를 기반으로 스레드 객체를 얻기 위해 사용됩니다.
이getThread()
함수는Thread
매개 변수에 의해 지정된 스레드Id를 가진 객체
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/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/threading/eventLoop}
이currentThread()
함수는 현재 스레드의 스레드 객체를 얻기 위해 사용됩니다.
이currentThread()
함수는 현재 스레드의 스레드 객체를 반환합니다.
Thread
물체
현재 스레드 ((()
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/event Loop}, {@fun/Threads/threads/threading/mainThread mainThread}, {@fun/Threads/threads/threading/threading/threading/thread Thread Lock}, {@fun/Threads/threads/threading/lock Lock}, {@fun/Threads/threading/eventLoop eventLoop}, {@fun/Threads/threads/eventLoop}
이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()
}
두 개의 동시 스레드가 공통 리소스에 접속합니다.
백테스팅 시스템과 라이브 거래 환경을 지원합니다.
{@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/Dict Dict}, {@fun/Threads/threads/threading/pending pending}, {@fun/Threads/threads/threading/threading/eventLoop}, {@fun/Threads/threads/threads/eventLoop}
이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()
}
두 개의 동시 스레드가 공통 리소스에 접속합니다.
백테스팅 시스템은 이 기능을 구현하지 않고 정의만 합니다.
{@fun/Threads/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threads/threading/Event Event}, {@fun/Threads/threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/threading/eventLoop}
이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()
}
두 개의 동시 스레드가 공통 리소스에 접속합니다.
백테스팅 시스템과 라이브 거래 환경을 지원합니다.
{@fun/Threads/threading/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/condition Condition}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threading/Dict Dict}, {@fun/Threads/threading/pending pending}, {@fun/Threads/threading/threading/eventLoop eventop},
이Dict()
함수는 동시 스레드에 전달하기 위해 사전 객체를 생성하는 데 사용됩니다.
이Dict()
함수는 a를 반환합니다ThreadDict
object.
ThreadDict
물체
딕트 (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()
}
일반 객체를 동시 스레드 실행 함수로 전달하여 객체의 키 값을 수정하면 다른 스레드에서 객체의 키 값을 변경하는지 테스트합니다.
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/getThread getThread}, {@fun/Threads/threading/mainThread mainThread}, {@fun/Threads/threading/currentThread currentThread}, {@fun/Threads/threading/Lock Lock}, {@fun/Threads/threading/condition Condition}, {@fun/Threads/threading/event Event}, {@fun/Threads/threading/threading/Thread Thread}, {@fun/Threads/threading/threading/pending pending}, {@fun/Threads/threading/eventLoop}
이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())
}
동시에 실행되는 두 개의 스레드를 만들고pending()
서로 다른 시간 노드에서 작동합니다.
이 전략이main()
함수가 실행되기 시작하면 함수를 호출합니다pending()
바로 1을 반환합니다. 왜냐하면 전략이 있는 주요 스레드이기 때문입니다.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/threading/Dict Dict}, {@fun/Threads/threading/Thread Thread}, {@fun/Threads/threading/eventLoop}
네트워크 설정 스라인