多线程使用场景

当前台传入后台数据量过大,可以将前台数据分批次传入后台,使用redis缓存起来,等待所有数据传入完成后,后台开启线程进行处理。
注意:
1、注意当前是第几组数据
2、是否为最后一组数据
3、redis插入时保证始终从一端插入(右插)

var count = 0;  //当前是第几组
var threadCount=0;//当前线程的数量
/**
 *
 * @param showStr 遮罩层提示语
 * @param bpcthreadCount 最大线程限制数
 * @param singleThreadDataCount  每个线程的最大数据
 * @param datas 保存数据
 * @param dataFunc 保存前数据处理的方法名
 */
function theardMain(showStr,bpcthreadCount,singleThreadDataCount,datas,dataFunc) {
    var key =("fb_"+guid());
    coverShow(showStr);
    count = 0;
    threadCount=0;
    var pos=0,totalSize=datas.length-1;
    doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc);
    $('.coverpro').show();
    $('.converprobar').css('width','0%');
    $('.coverpronum').html('0%');
    pollingReply(key,singleThreadDataCount);
}


/**
 * 多线程的启动轮询方法
 * @param datas 多线程执行的数据
 * @param pos 当前数据的长度
 * @param totalSize 数据最大的长度
 * @param bpcthreadCount 当前线程的数量
 * @param singleThreadDataCount 每个线程需要的数据长度
 * @param key 当前线程执行时redis的ke值
 * @param url url
 * @param isDocheckdown 是下达/批复还是撤销下达/撤销批复
 * @param urltype url的类型
 */
function doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc){ //线程方法
    if(pos>totalSize){//当前数据长度大于最大数据长度,说明执行成功
        return;
    }
    if(threadCount<=bpcthreadCount){//限制线程数量
        var endPos = pos+singleThreadDataCount;
        var subData = datas.slice(pos,endPos); //当前的数据
        var isEnd =false;
        if(endPos>=totalSize){
            isEnd = true;
        }
        pos=endPos;
        threadCount++; //线程数量增加1
        doSubCheckDown(subData,key,totalSize+1,isEnd,bpcthreadCount,dataFunc);
    }
    setTimeout(function(){
        doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc);
    },100);
}

/**
 * 多线程执行的后台方法
 * @param subData 当前的数据
 * @param key 当前线程执行时redis的ke值
 * @param sumNum 最大的数据长度
 * @param url url
 * @param isDocheckdown 是下达/批复还是撤销下达/撤销批复
 * @param urltype url的类型
 */
function doSubCheckDown(subData,key,sumNum,isEnd,threadCountCount,dataFunc){
    count++;
    var param={subData:subData,isEnd:isEnd,count:count,sumNum:sumNum,threadCountCount:threadCountCount,key:key};
    var func = window[dataFunc];
    var data = func.apply(this,[param]);
    doCommonAsyncServereCall(bosspageconfig.bosspagebean, "theardMain", data,
        function(result) {
            threadCount--;//线程结束,减1
        }, function(result) {
            threadCount--;//线程结束,减1
        }, false, "正在保存中.......");
}




/**
 * 轮询后台接口,查询当前进度,是否完成
 * @param key 当前执行时redis的ke值
 * @param singleThreadDataCount 每个线程执行的数据长度
 */
function pollingReply(key,singleThreadDataCount) {
    doCommonAsyncServereCall(bosspageconfig.bosspagebean, "/pollingReply", {"key":key,"num":singleThreadDataCount},
        function(result) {
            if(result&&result.result&&result.result==true){//执行成功
                coverHide();
                if(result.failMsg){
                    toastr.warning(result.failMsg);
                }else {
                    toastr.success(result.msg);
                }
                dorefresh()
                $('.coverpro').hide();
                $('.converprobar').css('width',0);
                $('.coverpronum').html('');
                return;
            }else {//执行过程中。。。
                $('.coverpro').show();

                setTimeout(function() {
                    pollingReply(key,singleThreadDataCount);
                    $('.converprobar').css('width',result.schedule+'%');
                    $('.coverpronum').html(result.schedule+'%');

                }, 4000);
            }
        }, function(result) {
            coverHide();
            toastr.error(result.msg);
        });
}

你可能感兴趣的:(多线程使用场景)