পরিমাণগত কৌশল বাস্তবায়নের সময়, সমান্তরাল সম্পাদন বিলম্ব হ্রাস করতে পারে এবং অনেক ক্ষেত্রে দক্ষতা উন্নত করতে পারে। উদাহরণস্বরূপ হেজিং রোবট গ্রহণ করে, আমাদের দুটি মুদ্রার গভীরতা পেতে হবে। ক্রম অনুসারে সম্পাদিত কোডটি নিম্নরূপঃ
var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()
একটি বিশ্রাম এপিআই অনুরোধে একটি বিলম্ব রয়েছে। অনুমান করা হচ্ছে যে এটি 100ms, গভীরতা অর্জনের সময় আসলে ভিন্ন। যদি আরও অ্যাক্সেসের প্রয়োজন হয় তবে বিলম্ব সমস্যাটি আরও বিশিষ্ট হয়ে উঠবে এবং কৌশলটির বাস্তবায়নকে প্রভাবিত করবে।
জাভাস্ক্রিপ্টে মাল্টিথ্রেডিং নেই, তাই এই সমস্যা সমাধানের জন্য গো ফাংশনটি নীচে ক্যাপসুল করা হয়েছে। তবে, নকশা প্রক্রিয়াটির কারণে বাস্তবায়নটি তুলনামূলকভাবে জটিল।
var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() // Call the wait method to wait for the return of the depth result asynchronously
var depthB = b.wait()
বেশিরভাগ সহজ ক্ষেত্রে, এইভাবে কৌশল লেখার সাথে কিছুই ভুল নেই। তবে এটি লক্ষ করা উচিত যে এই প্রক্রিয়াটি প্রতিটি কৌশল লুপের জন্য পুনরাবৃত্তি করা উচিত। মধ্যবর্তী পরিবর্তনশীল a এবং b কেবলমাত্র অস্থায়ী সহায়ক। যদি আমাদের অনেকগুলি সমান্তরাল কাজ থাকে তবে আমাদের a এবং depthA, এবং b এবং depthB এর মধ্যে সংশ্লিষ্ট সম্পর্ক রেকর্ড করা দরকার। যখন আমাদের সমান্তরাল কাজগুলি অনিশ্চিত হয়, তখন পরিস্থিতি আরও জটিল হয়ে ওঠে। অতএব, আমরা একটি ফাংশন বাস্তবায়ন করতে চাইঃ যখন সমান্তরালভাবে যান লিখুন, একই সময়ে একটি পরিবর্তনশীল আবদ্ধ করুন, এবং যখন সমান্তরাল অপারেশনের ফলাফল ফিরে আসে, তখন ফলাফলটি স্বয়ংক্রিয়ভাবে পরিবর্তনশীলকে বরাদ্দ করা হবে, মধ্যবর্তী পরিবর্তনশীলকে নির্মূল করে এবং এইভাবে প্রোগ্রামটিকে আরও সংক্ষিপ্ত করে তোলে। নির্দিষ্ট বাস্তবায়নটি নিম্নরূপঃ
function G(t, ctx, f) {
return {run:function(){
f(t.wait(1000), ctx)
}}
}
আমরা একটি G ফাংশন সংজ্ঞায়িত করি, যেখানে প্যারামিটার t হ'ল Go ফাংশন যা চালানো হবে, ctx হল রেকর্ডিং প্রোগ্রামের প্রসঙ্গ, এবং f হ'ল নির্দিষ্ট অ্যাসাইনমেন্ট ফাংশন। আপনি পরে ফাংশনটি দেখতে পাবেন।
এই সময়ে, সামগ্রিক প্রোগ্রাম ফ্রেমওয়ার্কটি
var Info = [{depth:null, account:null}, {depth:null, account:null}] // If we need to obtain the depth and account of the two exchanges, more information can also be put in, such as order ID, status, etc.
var tasks = [ ] // Global list of tasks
function produce(){ // Issue various concurrent tasks
// The logic of task generation is omitted here, for demonstration purposes only.
tasks.push({exchange:0, ret:'depth', param:['GetDepth']})
tasks.push({exchange:1, ret:'depth', param:['GetDepth']})
tasks.push({exchange:0, ret:'sellID', param:['Buy', Info[0].depth.Asks[0].Price, 10]})
tasks.push({exchange:1, ret:'buyID', param:['Sell', Info[1].depth.Bids[0].Price, 10]})
}
function worker(){
var jobs = []
for(var i=0;i<tasks.length;i++){
var task = tasks[i]
tasks.splice(i,1) // Delete executed tasks
jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
Info[task.exchange][task.ret] = v // The v here is the return value of the concurrent Go function wait(), which can be experienced carefully.
}))
}
_.each(jobs, function(t){
t.run() // Execute all tasks concurrently here
})
}
function main() {
while(true){
produce() // Send trade orders
worker() // Concurrent execution
Sleep(1000)
}
}
মনে হচ্ছে যে একটি সহজ ফাংশন শুধুমাত্র বৃত্তাকার ঘোরাঘুরি করার পরে বাস্তবায়িত হয়েছে। আসলে, কোডের জটিলতা ব্যাপকভাবে সরলীকৃত হয়েছে। আমাদের কেবল প্রোগ্রামটি কী কাজগুলি তৈরি করতে হবে সে সম্পর্কে যত্নবান হওয়া দরকার। ওয়ার্কার))) প্রোগ্রাম স্বয়ংক্রিয়ভাবে একই সাথে তাদের কার্যকর করবে এবং সংশ্লিষ্ট ফলাফল ফেরত দেবে। নমনীয়তা অনেক উন্নত হয়েছে।