javascript 多线程异步队列

首先,你得知道 jQuery.Deferred 的大致用法,然后,我们进入正题吧:

库代码:

/*!
 * 多线程异步队列
 * 依赖 jQuery 1.8+ (如果你用的是 1.6或1.7, 只要将源码中的 then方法替换为pipe方法 即可)
 */

/**
 * @n {Number} 正整数, 线程数量
 */
function Queue (n) {
    n = parseInt(n || 1, 10);
    return (n && n > 0) ? new Queue.prototype.init(n) : null;
}

Queue.prototype = {
    init: function (n) {
        this.threads = [];
        this.taskList = [];

        while (n--) {
            this.threads.push(new this.Thread)
        }
    },

    /**
     * @callback {Fucntion} promise对象done时的回调函数,它的返回值必须是一个promise对象
     */
    push: function (callback) {
        if (typeof callback !== ‘function‘) return;

        var index = this.indexOfIdle();

        if (index != -1) {
            this.threads[index].idle(callback)
            try { console.log(‘Thread-‘ + (index+1) + ‘ accept the task!‘) } catch (e) {}
        }
        else {
            this.taskList.push(callback);

            for (var i = 0, l = this.threads.length; i < l; i++) {

                (function(thread, self, id){
                    thread.idle(function(){
                        if (self.taskList.length > 0) {
                            try { console.log(‘Thread-‘ + (id+1) + ‘ accept the task!‘) } catch (e) {}

                            var promise = self.taskList.pop()();    // 正确的返回值应该是一个promise对象
                            return promise.promise ? promise : thread.promise;
                        } else {
                            return thread.promise
                        }
                    })
                })(this.threads[i], this, i);

            }
        }
    },
    indexOfIdle: function () {
        var threads = this.threads,
            thread = null,
            index = -1;

        for (var i = 0, l = threads.length; i < l; i++) {
            thread = threads[i];

            if (thread.promise.state() === ‘resolved‘) {
                index = i;
                break;
            }
        }

        return index;
    },
    Thread: function () {
        this.promise = $.Deferred().resolve().promise();

        this.idle = function (callback) {
            this.promise = this.promise.then(callback)
        }
    }
};

Queue.prototype.init.prototype = Queue.prototype;

使用示例:

    var queue = new Queue(3);    // 创建一个具有3个线程的队列
  // task-1
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 8000);

        return defer.promise()
    })
  // task-2
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 2000);

        return defer.promise()
    })
  // task-3
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 6000);

        return defer.promise()
    })
  // task-4
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 3000);

        return defer.promise()
    })
  // task-5
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 2000);

        return defer.promise()
    })
  // task-6
    queue.push(function(){
        var defer = $.Deferred();

        setTimeout(function(){
            defer.resolve()
        }, 2000);

        return defer.promise()
    })

控制台有显示 queue.push的 function (暂且叫它task)  最终是哪个进程处理的

实例化后,队列里的3个线程都是处于空闲状态的
将task-1分配给线程1, 这个任务耗时 8s
将task-2分配给线程2, 这个任务耗时 2s
将task-3分配给线程3, 这个任务耗时 6s

因为当前没有空闲进程,队列内部则将task-4、task-5、task-6添加到等候区

因为task-2耗时2s,进程2最先被解放,然后task-4就被分配到进程2去处理,以此类推,最后控制台显示的进程使用情况是:1、2、3、2、2、3

时间: 2024-10-05 11:41:50

javascript 多线程异步队列的相关文章

[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列

这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包封装一个创建li元素的函数. 1 var create = (function(){ 2 var count = 0; 3 return function(){ 4 var oLi = document.createElement( "li" ); 5 oLi.innerHTML = co

JavaScript多线程初步学习

一.多线程理解 首先,我们要理解什么是多线程,百度百科上说:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系统包括对称多处理机.多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器.[1]  在一个程序中,这些独立运行的程序片段叫作“线程”(

生产者消费者模型实现多线程异步交互

[Python之旅]第六篇(五):生产者消费者模型实现多线程异步交互 消息队列 生产者消费者模型 多线程异步交互 摘要:  虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用... 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应

.Net中的并行编程-4.实现高性能异步队列

上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队列主要用于实时数据流的处理并简化多线程编程模型.设计该队列时考虑以下几点需求(需求来自公司的一个实际项目): 1. 支持多线程入队出队,尽量简化多线程编程的复杂度. 2. 支持事件触发机制,数据入队时才进行处理而不是使用定时处理机制, 而且内部能阻塞消费者线程. 3. 出队时数据处理的顺序要保证和入队时是一致

c# 多线程排队队列实现的源码

[csharp] view plaincopy using System; using System.Threading; using System.Collections; using System.Collections.Generic; // 将线程同步事件封装在此类中, // 以便于将这些事件传递给 Consumer 和 // Producer 类. public class SyncEvents { public SyncEvents() { // AutoResetEvent 用于"

多线程异步加载图片

多图片多线程异步下载 开发中非常常用的就是就是图片下载,我们常用的就是SDWebImage,但是作为开发人员,不仅要能会用,还要知道其原理.本文就会介绍多图下载的实现. 本文中的示例Demno地址,下载后项目位于iOS_Demo/09-多图片多线程下载 1 - 问题 开篇我就先将多图下载过程中出现的问题摆出来,让我们能够一一克服 . 1:下载过程要放到子线程中,否则会导致UI线程卡顿 2:图片会重复下载,我们不仅要把下载完的图片放到内存中,还要把下载队列也缓存起来,否则可能图片没有下载完,会多次

GCP异步队列-看过的最完整的文章了,特地转载一下

GCP异步队列-看过的最完整的文章了,特地转载一下 分类: Iphone开发入门 2014-04-16 11:48 309人阅读 评论(0) 收藏 举报 概念: 程序中同步和异步是什么意思?有什么区别? 解释一: 异步调用是通过使用单独的线程执行的.原始线程启动异步调用,异步调用使用另一个线程执行请求,而与此同时原始的线程继续处理. 同步调用则在继续之前必须等待响应或返回值.如果不允许调用继续即无响应或返回值,就说调用被阻塞了,不能继续执行. 解释二: 同步.一条马路,只能开一辆车,等这个车开走

.Net中的并行编程-7.基于BlockingCollection实现高性能异步队列

三年前写过基于ConcurrentQueue的异步队列,今天在整理代码的时候发现当时另外一种实现方式-使用BlockingCollection实现,这种方式目前依然在实际项目中使用.关于BlockingCollection的基本使用请查阅MSDN.源码实现 下面直接上代码:(代码已经放到了我的github上) using System; using System.Collections.Concurrent; using System.Collections.Generic; using Sys

JavaScript及其异步实现续:Promise让一切更简单

在写这篇文章之前,我参考了以下文章.所以我文中的例子都是精准的,而且有循可依.下面抛出例子的链接: Understanding JQuery.Deferred and PromiseDeferred and promise in jQuery Edit:在翻网站的时候,看到腾讯技术团队居然也刚写了一篇Promise的文章,加下链接,以作备忘. JavaScript Promise启示录 Deferred在JQuery1.5的版本被引进,这项功能的引进使JQuery变得更加强大,良好的异步支持,让