3
پر توجہ دیں
1444
پیروکار

مقداری حکمت عملیوں کے ساتھ ساتھ عمل درآمد کے لیے جاوا اسکرپٹ کا استعمال کرنا - گو فنکشنز کو شامل کرنا

میں تخلیق کیا: 2019-06-29 11:24:57, تازہ کاری: 2023-10-26 20:06:10
comments   3
hits   2797

مقداری حکمت عملیوں کے ساتھ ساتھ عمل درآمد کے لیے جاوا اسکرپٹ کا استعمال کرنا - گو فنکشنز کو شامل کرنا

مقداری حکمت عملیوں کو نافذ کرتے وقت، بہت سے معاملات میں، ایک ساتھ عمل درآمد تاخیر کو کم کر سکتا ہے اور کارکردگی کو بہتر بنا سکتا ہے۔ ایک مثال کے طور پر ہیجنگ روبوٹ کو لے کر، دو سکوں کی گہرائی کو حاصل کرنا ضروری ہے جو ترتیب میں نافذ کیا گیا ہے:

var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()

باقی API کی درخواست کرنے میں تاخیر ہوتی ہے، اس کے بعد دو بار گہرائی حاصل کرنے کا وقت مختلف ہوتا ہے، جس سے حکمت عملی پر عمل درآمد متاثر ہوتا ہے۔

چونکہ JavaScript میں ملٹی تھریڈنگ نہیں ہے، اس لیے اس مسئلے کو حل کرنے کے لیے بنیادی Go فنکشن کو انکیپسلیٹ کیا گیا ہے، لیکن اس کے ڈیزائن میکانزم کی وجہ سے، عمل درآمد کافی بوجھل ہے۔

var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() //调用wait方法等待返回异步获取depth结果 
var depthB = b.wait()

زیادہ تر سادہ معاملات میں، پالیسی کو اس طرح لکھنے میں کوئی حرج نہیں ہے۔ لیکن نوٹ کریں کہ اس عمل کو ہر بار جب حکمت عملی لوپ کرتی ہے دہرائی جانی چاہیے، اور درمیانی متغیرات a اور b دراصل صرف عارضی امداد ہیں۔ اگر ہمارے پاس بہت سارے ہم آہنگ کام ہیں، تو ہمیں a اور depthA، اور b اور depthB کے درمیان خط و کتابت کو ریکارڈ کرنے کی ضرورت ہے جب ہمارے ہم آہنگ کام غیر یقینی ہوتے ہیں، صورت حال مزید پیچیدہ ہو جاتی ہے۔ لہذا، ہم ایک فنکشن کو نافذ کرنا چاہتے ہیں: Go concurrency لکھتے وقت، ایک ہی وقت میں ایک متغیر کو بائنڈ کریں، اور جب کنکرنٹ چل رہا ہے تو نتیجہ خود بخود متغیر کو تفویض کر دیا جاتا ہے، اس طرح انٹرمیڈیٹ متغیرات کو ختم کر کے پروگرام کو مزید بنایا جاتا ہے۔ مختصر مخصوص نفاذ مندرجہ ذیل ہے:

function G(t, ctx, f) {
    return {run:function(){
        f(t.wait(1000), ctx)
    }}
}

ہم ایک G فنکشن کی وضاحت کرتے ہیں، جہاں پیرامیٹر t گو فنکشن ہے جس پر عمل کیا جائے گا، ctx پروگرام کا سیاق و سباق ہے، اور f مخصوص اسائنمنٹ کے لیے فنکشن ہے۔ ہم جلد ہی اس فنکشن کو عملی شکل میں دیکھیں گے۔

اس مقام پر، مجموعی طور پر پروگرام کے فریم ورک کو “پروڈیوسر-صارف” ماڈل کے طور پر لکھا جا سکتا ہے (کچھ اختلافات کے ساتھ)، جہاں پروڈیوسر مسلسل کام جاری کرتے ہیں اور صارفین انہیں ایک ساتھ انجام دیتے ہیں، درج ذیل کوڈ صرف نمائش کے لیے ہے اور اس میں پروگرام شامل نہیں ہے۔ منطق پر عمل کریں۔

var Info = [{depth:null, account:null}, {depth:null, account:null}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单Id,状态等。
var tasks = [ ] //全局的任务列表

function produce(){ //下发各种并发任务
  //这里省略了任务产生的逻辑,仅为演示
  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) //删掉已执行的任务
        jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
                    Info[task.exchange][task.ret] = v //这里的v就是并发Go函数wait()的返回值,可以仔细体会下
                }))
    }
    _.each(jobs, function(t){
            t.run() //在这里并发执行所有任务
        })
}
function main() {
    while(true){
        produce()         // 发出交易指令
        worker()        // 并发执行
        Sleep(1000)
    }
}

ایسا لگتا ہے کہ ہم نے بہت سارے مراحل سے گزرنے کے بعد صرف ایک سادہ فنکشن کو لاگو کیا ہے، لیکن حقیقت میں، کوڈ کی پیچیدگی کو بہت آسان بنا دیا گیا ہے، ہمیں صرف اس بات کی پرواہ کرنے کی ضرورت ہے کہ پروگرام کو کن کاموں کو پیدا کرنے کی ضرورت ہے، اور کارکن( ) پروگرام خود بخود انہیں بیک وقت انجام دے گا اور متعلقہ نتائج واپس کر دے گا۔ لچک کو بہت بہتر بنایا گیا ہے۔