کوانٹیفیکیشن کی پالیسیوں کو جاوا اسکرپٹ کے ساتھ مل کر چلنے والی Go افعال کو پلاسٹک میں لپیٹنا

مصنف:گھاس, تخلیق: 2019-06-29 11:24:57, تازہ کاری: 2023-10-26 20:06:10

img

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

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

ایک بار درخواست کرنے کے بعد rest API میں تاخیر ہوتی ہے ، فرض کریں کہ یہ 100ms ہے ، پھر دو بار گہرائی حاصل کرنے میں دراصل وقت مختلف ہوتا ہے ، اگر زیادہ سے زیادہ رسائی کی ضرورت ہوتی ہے تو ، تاخیر کا مسئلہ زیادہ نمایاں ہوگا ، جس سے حکمت عملی کے نفاذ پر اثر پڑے گا۔

جاوا اسکرپٹ میں بہت سارے موضوعات نہیں ہیں ، لہذا اس مسئلے کو حل کرنے کے لئے نیچے کی سطح پر 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 دراصل صرف عارضی معاون ہیں۔ اگر ہمارے پاس بہت زیادہ ہم آہنگی والے کام ہیں تو ، ہم آہنگی کے کاموں کے درمیان ایک اور ردعمل کو بھی ریکارڈ کرنا پڑتا ہے ، اور جب ہمارے ہم آہنگی کے کام کا تعین نہیں ہوتا ہے تو صورتحال زیادہ پیچیدہ ہوجاتی ہے۔ لہذا ، ہم ایک فنکشن کو نافذ کرنا چاہتے ہیں: جب ہم آہنگی میں لکھتے ہیں تو ، ایک متغیر کو پابند کریں ، اور جب ہم آہنگی کے نتائج واپس آتے ہیں تو ، نتیجہ خود بخود متغیر کو تفویض کیا جاتا ہے ، اس طرح درمیانی متغیر کو چھوڑ دیا جاتا ہے ، تاکہ پروگرام کو زیادہ جامع بنایا جاسکے۔

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}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单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)
    }
}

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


متعلقہ

مزید

77924998گراس دیوتا، کیا آپ پورے پطرون کو

ریجنٹاپنے آپ کو متعارف کروانا

گھاسpython کے پاس اپنی ہم آہنگی کی لائبریری ہے، جو Go کے مقابلے میں آسان ہے