자바스크립트를 사용하여 양정책을 구현하여 포괄 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는 실제로 임시 보조일 뿐입니다. 만약 우리가 동시 작업이 매우 많다면, 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}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单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자, 자, 자, 자.

레진트소개 부탁드립니다

초목파이썬은 자체의 코코드 라이브러리를 가지고 있습니다.