Type/to search
8
Follow
1364
Followers
জাভাস্ক্রিপ্ট কৌশল ডিজাইনে __থ্রেড ফাংশনের প্রয়োগ
Discussions
Created 2023-07-04 16:35:42  Updated 2024-11-11 22:41:32
 3
 1330

img

জাভাস্ক্রিপ্ট কৌশল ডিজাইনে __থ্রেড ফাংশনের প্রয়োগ

আসল এফএমজেড কৌশল ডিজাইনে, আপনার যদি অ্যাসিঙ্ক্রোনাস এবং সমসাময়িক ক্রিয়াকলাপগুলি ব্যবহার করার প্রয়োজন হয় তবে আপনি কেবল ব্যবহার করতে পারেনexchange.Go()FMZ এনক্যাপসুলেশন ইন্টারফেসের একযোগে কার্যকর করার জন্য ফাংশন, এবং কিছু কাস্টম অপারেশন (ফাংশন) একযোগে চালানো যাবে না। যদিও এই নকশাটি কৌশল প্রোগ্রামগুলিকে অনেক বেশি দক্ষ করে তোলে, তবে দেশীয় প্রোগ্রামিং ভাষায় একযোগে ডিজাইনের অভিজ্ঞতা রয়েছে এমন ছাত্ররা সর্বদা খুব অস্বস্তি বোধ করে।

এমনকি নতুন ছাত্ররাও আছে যারা পরিমাণগত ট্রেডিং শুরু করার জন্য FMZ ব্যবহার করে এবং এটি বুঝতে পারে না।exchange.Go()ফাংশন ব্যবহার, ব্যবহারexchange.Go()দেখে মনে হচ্ছে বিবৃতিগুলি এখনও একের পর এক ক্রমানুসারে কার্যকর করা কোডে কার্যকর করা হয়েছে। সুতরাং এই নিবন্ধে, আসুন FMZ প্ল্যাটফর্মের নতুন সমবর্তী থ্রেড ফাংশনগুলি অন্বেষণ করি:__Thread()ফাংশনের একটি সিরিজ এবং কৌশল প্রোগ্রামের অ্যাসিঙ্ক্রোনাস ডিজাইনের ব্যবহার।

1. সহজ সঙ্গতি নকশা

মূল স্ট্র্যাটেজি থ্রেড চলাকালীন আমরা যে কাস্টম ফাংশনটি লিখেছিলাম তা চালানোর জন্য যদি আমরা একই সাথে একটি সাব-থ্রেড চালাতে চাই, আমরা নিম্নলিখিত কোডের মতো একটি ডিজাইন ব্যবহার করতে পারি। কৌশল কোডে একটি ফাংশন কাস্টমাইজ করুনGetTickerAsync(), এই ফাংশনের নির্দিষ্ট ফাংশন লিখুন। এই ফাংশন একটি অসীম লুপ চালায়whileFMZ এর API ইন্টারফেস ক্রমাগত লুপে বলা হয়:GetTicker()বাজার তথ্য পেতে.

এবং তারপর ব্যবহার করুন__threadSetData(0, "ticker", t)এই বাক্যটি মূল থ্রেডে ডেটার একটি অংশ লেখে এবং ডেটার নামticker, ডেটা মান হলtএখনইGetTicker()রিটার্ন মান।

javascript
__threadSetData(0, "ticker", t)

থ্রেডের একযোগে কার্যকর করার জন্য কাস্টম ফাংশন ডিজাইন করার পরে, আমরা লিখতে পারিmain()ফাংশনের কোড ইন আছেmain()ফাংশন শুরু করতে, আমরা ব্যবহার করি:

javascript
__Thread(GetTickerAsync, 0) // GetTickerAsync为需要并发执行的自定义函数,0为这个传入GetTickerAsync函数的参数

একটি সমবর্তী থ্রেড তৈরি করুন এবং কার্যকর করা শুরু করুনGetTickerAsync()ফাংশন তারপরmain()ফাংশনটি তার নিজস্ব কার্যকর করা শুরু করেwhileলুপ, লুপে গ্রহণGetTickerAsync()ফাংশন ডেটা আপডেট করে এবং তারপর মুদ্রণ করে:

javascript
var t = __threadGetData(0, "ticker") Log(t)

সম্পূর্ণ কোড উদাহরণ:

javascript
function GetTickerAsync(index) { while (true) { var t = exchanges[index].GetTicker() __threadSetData(0, "ticker", t) Sleep(500) } } function main() { __Thread(GetTickerAsync, 0) while(true) { var t = __threadGetData(0, "ticker") Log(t) Sleep(1000) } }

বাস্তব ডিস্ক চলমান পরীক্ষা:

img

এটি হল সবচেয়ে সহজ অ্যাপ্লিকেশন ডিজাইন এর পরে, আসুন কিছু অন্যান্য প্রয়োজনীয় ডিজাইন দেখি।

2. সমবর্তী আদেশ নকশা

আপনি একই সময়ে 10টি থ্রেড তৈরি করতে একটি ফাংশন ডিজাইন করতে পারেন এবং প্রতিটি থ্রেড একটি অর্ডার অপারেশন ফাংশন চালায়। বিদ্যমানmain()একটি ফাংশন ডিজাইন করুনwhileলুপ, সনাক্তকরণ কৌশল ইন্টারঅ্যাকশন নির্দেশাবলী। ইন্টারেক্টিভ নির্দেশাবলী গ্রহণ করুন:placeMultipleOrdersশুধু এই সমবর্তী আদেশ ফাংশন কলtestPlaceMultipleOrders()

javascript
if (cmd == "placeMultipleOrders") { // ... }

কৌশল সম্পাদনা পৃষ্ঠায় কৌশল মিথস্ক্রিয়া নকশা যোগ করুন, একটি বোতাম সেট করুন এবং কমান্ডটি হল: placeMultipleOrders

img

সম্পূর্ণ কোড উদাহরণ:

javascript
function placeOrder(exIndex, type, price, amount) { var id = null if (type == "Buy") { id = exchanges[exIndex].Buy(price, amount) } else if (type == "Sell") { id = exchanges[exIndex].Sell(price, amount) } else { throw "type error! type:" + type } } function testPlaceMultipleOrders(index, beginPrice, endPrice, step, type, amount) { Log("beginPrice:", beginPrice, ", endPrice:", endPrice, ", step:", step, ", type:", type, ", amount:", amount) var tids = [] for (var p = beginPrice; p <= endPrice; p += step) { var tid = __Thread(placeOrder, index, type, p, amount) tids.push(tid) Sleep(10) } Sleep(1000) for (var i = 0; i < tids.length; i++) { __threadTerminate(tids[i]) } } function main() { while(true) { LogStatus(_D()) var cmd = GetCommand() if (cmd) { if (cmd == "placeMultipleOrders") { var t = _C(exchange.GetTicker) var beginPrice = t.Last * 0.8 var endPrice = t.Last * 0.9 var step = t.Last * 0.01 testPlaceMultipleOrders(0, beginPrice, endPrice, step, "Buy", 0.01) var orders = exchange.GetOrders() for (var i = 0; i < orders.length; i++) { Log(orders[i]) } } } Sleep(1000) } }
  • পরীক্ষাটি মুলতুবি অর্ডার পদ্ধতি ব্যবহার করে, বর্তমান মূল্যের 80% থেকে 90% বৃদ্ধি করে, পরীক্ষা করার জন্য সিমুলেটেড ডিস্ক পরিবেশ ব্যবহার করে এবং পরীক্ষার অর্ডার ট্রিগার করতে ইন্টারঅ্যাকশন বোতামে ক্লিক করে:

    img

  • "placeMultipleOrders" বোতামে ক্লিক করার পরে, প্রম্পট বার্তা:

    img

  • সমসাময়িক অর্ডার অপারেশনগুলি কৌশল লগে প্রদর্শিত হয়:

    img

3. সমসাময়িক থ্রেড এক্সিকিউশন ফাংশনে একটি WebSocket সংযোগ তৈরি করুন

এই প্রয়োজনীয়তাটি একজন FMZ ব্যবহারকারীর দ্বারা উত্থাপিত হয়েছিল।WebSocketমূল থ্রেডে কীভাবে ডেটা স্থানান্তর করা যায় তা সংযুক্ত করুন এবং ডিজাইন করুনmain()ফাংশন

এটি আসলে খুব সহজ, প্রায় আগের উদাহরণে সমসাময়িক থ্রেড তৈরি করার মতো। শুধু থ্রেড ব্যবহার মধ্যে যোগাযোগ__threadPeekMessage()ফাংশন যোগফল__threadPostMessage()ফাংশন বিনান্স এক্সচেঞ্জের WebSocket API ইন্টারফেস কলটিকে উদাহরণ হিসাবে নিলে, আমাদের ডিজাইনে WebSocket সংযোগের ক্লোজিং ক্রিয়াকলাপের দিকেও মনোযোগ দিতে হবে নিম্নলিখিত উদাহরণটি এটিকে বন্ধ করার জন্য একটি সমবর্তী থ্রেডকে কীভাবে অবহিত করতে হয় তাও দেখায়৷

সম্পূর্ণ কোড উদাহরণ:

javascript
var tid = null function createWS() { // wss://stream.binance.com:9443/ws/<streamName> , <symbol>@ticker var stream = "wss://stream.binance.com:9443/ws/btcusdt@ticker" var ws = Dial(stream) Log("创建WS连接:", stream) while (true) { var data = ws.read() if (data) { __threadPostMessage(0, data) } Log("接收到WS链接推送的数据,data:", data) // __threadPeekMessage 超时参数设置-1,不阻塞 var msg = __threadPeekMessage(-1) if (msg) { if (msg == "stop") { Log("并发线程Id:", __threadId(), "接收到stop指令") break } } } Log("并发线程执行完毕,关闭ws连接") ws.close() } function main() { tid = __Thread(createWS) Log("创建并发线程,线程Id:", tid) while(true) { // __threadPeekMessage 的超时参数设置为0,阻塞等待数据 var data = __threadPeekMessage(0) Log("接收到并发线程", ", Id:", tid, ", 发送的数据,data:", data, "#FF0000") var tbl = { type : "table", title : "<symbol>@ticker频道推送消息", cols : ["事件类型", "事件时间", "交易对", "24小时价格变化", "24小时价格变化百分比", "平均价格", "最新成交价格", "24小时内成交量", "24小时内成交额"], rows : [] } try { data = JSON.parse(data) tbl.rows.push([data.e, _D(data.E), data.s, data.p, data.P, data.w, data.c, data.v, data.q]) } catch (e) { Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message) } LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`") } } function onexit() { Log("扫尾函数,向Id为", tid, "的并发线程发送stop指令") __threadPostMessage(tid, "stop") Log("等待Id为", tid, "的并发线程停止") __threadJoin(tid) Log("扫尾函数执行完毕") }

বাস্তব ডিস্ক চলমান পরীক্ষা:

img

দেখা যায়main()সমসাময়িক থ্রেড দ্বারা তৈরি WebSocket সংযোগ থেকে ফাংশনটি ক্রমাগত বাজারের ডেটা গ্রহণ করে।

কৌশলটি বন্ধ হয়ে গেলে, সুইপ ফাংশন কাজ শুরু করবে:

img

Comment
All comments (3)

    最后一个实例,如果ws线程很多,并且订阅了多个话题,那么线程间通信的话,使用get/set的方式还是peek/post的方式哪种性能更好呢

    3 years ago

    两种方式差别不大的,都可以。

    3 years ago

    线程间共享变量的底层实现是不支持引用变量的,每次更新都得重新set,这效率很低

    3 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)