CN104991823A - 实现Javascript多任务机制的方法和设备 - Google Patents

实现Javascript多任务机制的方法和设备 Download PDF

Info

Publication number
CN104991823A
CN104991823A CN201510381861.3A CN201510381861A CN104991823A CN 104991823 A CN104991823 A CN 104991823A CN 201510381861 A CN201510381861 A CN 201510381861A CN 104991823 A CN104991823 A CN 104991823A
Authority
CN
China
Prior art keywords
event
javascript
active objects
task
timer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201510381861.3A
Other languages
English (en)
Other versions
CN104991823B (zh
Inventor
夏万强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Jingdong Shangke Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN201510381861.3A priority Critical patent/CN104991823B/zh
Publication of CN104991823A publication Critical patent/CN104991823A/zh
Application granted granted Critical
Publication of CN104991823B publication Critical patent/CN104991823B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Multi Processors (AREA)
  • Stored Programmes (AREA)

Abstract

为了解决在前端浏览器环境和后端node.js环境中统一使用Javascript多任务机制的问题,本发明提供了一种用于实现Javascript多任务机制的方法。该方法包括:在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;以及使用Javascript自身的事件循环机制对已由所述主动对象模拟的所述一个或多个任务进行执行调度。通过上述方法,可以解决在前端浏览器环境和后端node.js环境中统一使用Javascript多任务机制的问题。

Description

实现Javascript多任务机制的方法和设备
技术领域
本发明涉及互联网技术领域,并具体地涉及一种用于实现Javascript多任务机制的方法和设备。
背景技术
随着互联网技术的发展,Javascript不但占据了浏览器端的运行环境,而且利用node.js技术开始在服务器后端应用上也得到发展。但无论在浏览器环境还是在后端的node.js运行环境,Javascript都是在单线程里运行,所有的任务都是顺序执行的,这在早期的web网站型应用只利用Javascript处理页面交互还是足够的,并能带来很多便利,但随着互联网富应用(rich internet application)逐渐普及以及Javascript涉及后台业务实现的情况下,Javascript多任务机制成为必须。
目前在浏览器端和node.js后端服务器环境存在一些技术来实现Javascript下的多任务机制。
在支持HTML5的前端浏览器环境可以使用Web Worker来实现Javascript的多任务,每个Web Worker在浏览器的单个线程中执行。早期的浏览器使用iFrame技术来模拟多任务机制,浏览器里每个Frame在单独的线程里运行。后端的node.js环境中可以子进程来实现多任务,也可以通过纤程(fiber)来实现多任务。
然而使用Web Worker技术必须使用支持HTML5的浏览器,而早期的浏览器如IE6、IE7等并不支持HTML5,而且因为HTML5标准尚未完成,还存在浏览器兼容问题;Web Worker之间的交互还存在一些不便。此技术比较适合实现IO和密集计算等性质的多任务。
Node.js中使用子进程实现多任务较耗资源,子进程之间的交互不太方便;使用纤程需要扩展node.js,纤程本身使用的是V8系统的线程实现,纤程之间交互不方便。
上述技术要不限制在浏览器端,要不限制在node.js环境中,无法在前后两端统一使用。
因此,需要能够实现在前后两端统一使用的Javascript多任务机制的方法和设备。
发明内容
因此,需要一种能够减轻或解决上述问题的用于实现Javascript多任务机制的方法。
根据本发明的一个方案,提供了一种用于实现Javascript多任务机制的方法,包括:在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;以及使用Javascript自身的事件循环机制对已由所述主动对象模拟的所述一个或多个任务进行执行调度。
根据本发明的另一方案,提供了一种用于实现Javascript多任务机制的设备,该设备包括模拟模块,被配置为在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;以及调度模块,被配置为使用Javascript自身的事件循环机制对已由该主动对象模拟的该一个或多个任务进行执行调度。
本发明的上述技术方案通过使用Javascript自身的事件循环机制来实现多任务的执行调度,任务执行的顺序和事件到达的顺序一致,保证操作语义上的稳定性,且可以适用于前后端的运行环境,消除了浏览器兼容问题。
附图说明
通过下面结合附图对发明进行的详细描述,将使本发明的上述特征和优点更加明显,其中:
图1是示出根据本发明的实施例的Javascript多任务机制的示意图;
图2是示出根据本发明的一个实施例的Javascript多任务机制实现方法的示意流程图;
图3是示出根据本发明的另一实施例的Javascript多任务机制实现方法的示意流程图;以及
图4是示出根据本发明的一个实施例的Javascript多任务机制实现设备的示意框图。
具体实施方式
下面,参考附图详细说明本发明的优选实施方式。在附图中,虽然示于不同的附图中,但相同的附图标记用于表示相同的或相似的组件。为了清楚和简明,对已知功能和结构的详细描述将被省略,以避免使本发明的主题不清楚。
Javascript运行环境是基于事件循环(Event Loop)机制的,运行时(Runtime)逐步从事件队列中取出事件并调用相应的事件处理程序来执行,如果没有事件,则进入空闲状态。
在本发明的实施例中,使用主动对象模拟需要执行的任务,每个主动对象都在自己独立的运行环境中运行,主动对象里包含了该对象运行所需要的所有状态信息。主动对象之间通过发送事件进行交互,主动对象里定义了如何处理各种事件的方法。
在Javascript环境中所有主动对象都在主线程里运行,但相互不干扰,不共享状态。本发明的实施例使用主动对象模拟任务,然后使用Javascript自身的事件循环机制实现分时调度,从而实现多任务机制。
图1示出了根据本发明的实施例的Javascript多任务机制的示意图。
在该示意图中,Javascript事件循环负责运行环境的事件分发处理,UI事件(UI event)、IO事件(IO event)、系统事件(System event)以及定时器事件(Timer event)都由它来调度分发。
框架(Framework)包含了所有主动对象列表,管理业务事件的发布/订阅,管理所有业务任务相关的定时器。在图1的一般性示例的一个实现示例中,其可包括以下属性
activeObjects:[],主动对象列表,用于管理所有主动对象的生命周期
subscribes:{},主动对象订阅的业务事件的地图,管理业务事件的发布和订阅
timeEvents:[],业务相关的定时事件
timerId:0,业务定时事件检查的定时器
tickRate:50,业务定时事件检查时间间隔,以毫秒为单位
tick:function  业务定时事件的定时处理函数
框架(Framework)可定时(如每隔10ms)检查定时器列表(timerlist)中的业务定时器是否触发,若触发则将相应的事件加入到任务的事件队列里。而在使用主动对象来模拟任务时,每当主动对象接收到事件,就会设置Javascript定时任务(将定时时间设置为0),以此来对该任务做执行调度。当Javascript事件循环开始处理该定时事件时,执行对应的任务。任务的执行则是从该任务事件队列中取出第一个事件进行分发,任务对象(即,对应的主动对象)可根据当前状态对事件进行处理。任务对象可按状态机方式实现。
框架(Framework)管理所有的主动对象,所有主动对象在使用前可注册到框架中,框架可提供按照名称或ID获取主动对象的接口。框架还实现了一个事件总线(Event Bus),主动对象可以订阅一些事件,也可以根据业务需要发布特定事件,事件总线会将相应的事件发送到订阅者(相应主动对象)的事件队列中,以此激活该主动对象的执行调度,来处理此事件。框架也在定时器列表(timer list)中管理所有主动对象的定时器,定时检查定时器是否触发。
主动对象类似一个轻量级线程,一直处于运行状态等待事件(例如框架根据该主动对象的订阅发送的事件)的来临。当接收到事件时,该对象加入到Javascript事件循环中等待执行。图1中示出的主动对象的各项属性如下:
EventQueue  事件队列,用于存储所有收到的业务事件
DeferQueue  延迟事件队列,存储所有当前状态不能处理且需要延后处理的事件;
Properties  可能状态对象,定义主动对象可能出现的状态;
State       当前状态对象,每个状态对象定义了所有它能处理的事件的处理逻辑和状态迁移前后的处理逻辑
Dispatch    事件分发处理,取出事件队列中的一个事件交给当前状态进行事件处理
事件的发送和处理是异步的,主动对象的一个执行周期,就是从自己的事件队列中取出一个事件,将该事件分发,根据主动对象当前状态和事件类型作相应的业务处理。处理事件过程中也会发生对象状态的迁移。主动对象的内部可采用状态机的机制。当主动对象的当前状态不适合处理所分发的事件时,可以忽略该事件,或者将该事件加入延迟事件队列,当对象处于合适的状态时再召回这些事件,这就是事件的延迟和召回机制。主动对象之间可以有父子关系,父对象负责管理子对象的生命周期,这对应于任务和子任务之间的关系。主动对象之间通过事件传递进行交互,相互间不共享任何状态,整个交互机制是基于事件驱动的异步交互方式。
每个事件包含了事件类型信息、发送者信息和相关数据。事件的各项属性如下:
type   定义事件类型
sender 定义事件发送对象
data   定义事件的数据
事件的处理和发送是异步的,事件发送只是将该事件加入到目标任务的事件队列中,只有到下次调度时,事件才执行。
基于上述的实现机制,下面参考图2和图3描述根据本发明实施例的Javascript多任务机制实现方法的示意流程图。
图2示出了根据本发明实施例的Javascript多任务机制实现方法的简要视图。
如图2中所示,在步骤210中,在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务。
在步骤220中,使用Javascript自身的事件循环机制对已由主动对象模拟的该一个或多个任务进行执行调度。
而在根据本发明的其他实施例中,Javascript多任务机制实现方法还可包括更多步骤。图3示出了这样的一个示例。
在图3的步骤310中,在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务
在步骤320中,例如在进行执行调度之前,将主动对象注册到框架。此时,主动对象可订阅相关事件,也可以根据业务需要发布特定事件。
框架可提供按照名称或ID来获取主动对象的接口。
在步骤330中,主动对象可发送/接收相关事件,并将接收到的相关事件放入该主动对象的事件队列(Event Queue)中。
主动对象可通过框架实现的事件总线接收相关事件。在步骤340的一些实现示例中,框架可定时(如每隔10ms)检查其定时器列表中的业务定时器是否触发,若触发则可将相应的事件加入到对应任务(即与所触发的业务定时器对应的主动对象)的事件队列里。
在步骤340中,在接收到相关事件时,主动对象设置Javascript定时为零的定时器任务。
定时为零的定时器任务会直接加入到javascript的事件循环队列里,而不需要定时器的分时操作。
在步骤350中,利用Javascript自身的事件循环机制来对所设置的Javascript定时器为零的定时器任务进行执行调度。
Javascript事件循环在处理该定时事件时,执行对应的任务。
在步骤360中,主动对象根据步骤350中的调度从事件队列取出事件,并根据该主动对象的当前状态(State)对所取出的事件进行分发处理。
在步骤360的一些实现示例中,可从任务事件队列中取出第一个事件进行分发,对应的主动对象可根据当前状态(State)对事件进行处理。其中,任务对象可按状态机方式实现所述处理。
虽然本发明附图2和3以特定的顺序描述了本发明的一些实施例,然而需要注意的是,这些实施例可采用更多或更少的步骤,且并非必须按照图中所示的顺序来执行这些步骤。
图4示出了根据本发明的一些实施例的Javascript多任务机制实现设备。如图4所示,该实现设备包括:模拟模块410,被配置为在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;调度模块420,被配置为使用Javascript自身的事件循环机制对已由主动对象模拟的该一个或多个任务进行执行调度。
在一些实施例中,该实现设备还可包括注册模块430,被配置为在调度模块420进行执行调度之前,将主动对象注册到框架。其中,框架可提供按照名称或ID来获取主动对象的接口。
在一些实施例中,该实现设备还可包括收发模块440,被配置为使主动对象可发送/接收相关事件,并将接收到的相关事件放入该主动对象的事件队列(Event Queue)中。其中,主动对象可通过框架实现的事件总线(未示出)接收相关事件。
在一些实施例中,该实现设备还可以包括定时检测模块470,被配置为定时检查框架的业务定时器是否触发。如果被触发,收发模块440使得将该相关事件加入与所触发的业务定时器对应的主动对象的事件队列中。
在一些实施例中,该实现设备还可以包括定时模块450,被配置为在主动对象接收到相关事件时,使主动对象设置Javascript定时为零的定时器任务。此时,调度模块420利用Javascript自身的事件循环机制来对定时模块450设置的Javascript定时为零的定时器任务进行执行调度。
在一些实施例中,该实现设备还包括执行模块460,用于根据调度模块420的调度,使主动对象从该主动对象的事件队列取出事件并根据该主动对象的当前状态对所取出的事件进行分发处理。
在一些示例中,该分发处理是按状态机的方式进行的。
本发明的上述Javascript多任务机制实现设备可通过软件、硬件或其二者的组合来实现。例如,可通过软件模块的形式实现,或通过专用硬件的形式实现,本发明不对此进行限制。此外,在实际的实现中,也可以包括比图4中所示的模块多或少的模块来实现该设备。该设备也可以包括/涉及未示出的更多组件,例如用于存储数据的存储模块等。
本发明实施例的上述技术方案通过Javascript自身的事件循环机制来实现多任务的执行调度,任务执行的顺序和事件到达的顺序一致,保证操作语义上的稳定性。可以适用于前后端的运行环境,消除了浏览器兼容问题。业务任务被抽象为活动对象,通过事件进行交互,从设计上比较符合面向对象的设计方法,异步事件机制也消除了回调方式带来的复杂性。
上面的描述仅用于实现本发明的实施方式,本领域的技术人员应该理解,在不脱离本发明的范围的任何修改或局部替换,均应该属于本发明的权利要求来限定的范围,因此,本发明的保护范围应该以权利要求书的保护范围为准。

Claims (14)

1.一种用于实现Javascript多任务机制的方法,包括:
在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;以及
使用Javascript自身的事件循环机制对已由所述主动对象模拟的所述一个或多个任务进行执行调度。
2.根据权利要求1所述的方法,还包括:
在进行执行调度之前,将所述主动对象注册到框架中。
3.根据权利要求1所述的方法,还包括:
所述主动对象接收相关事件,并将接收到的相关事件放入所述主动对象的事件队列中。
4.根据权利要求3所述的方法,其中,所述主动对象接收相关事件并将接收到的相关事件放入所述主动象的事件队列中包括:
定时检查业务定时器是否触发;以及
如果触发,将所述相关事件加入与所触发的业务定时器对应的主动对象的事件队列中。
5.根据权利要求3所述的方法,还包括:
当所述主动对象接收到所述相关事件时,设置Javascript定时为零的定时器任务,以将所述Javascript定时为零的定时器任务添加到Javascript自身的事件循环队列中;以及
使用Javascript自身的事件循环机制对所述Javascript定时为零的定时器任务进行执行调度。
6.根据权利要求1-5中任一项所述的方法,还包括:
根据所进行的执行调度,所述主动对象从所述主动对象的事件队列取出事件,并根据所述主动对象的当前状态对所取出的事件进行分发处理。
7.根据权利要求6所述的方法,其中,所述分发处理是按状态机的方式实现的。
8.一种用于实现Javascript多任务机制的设备,所述设备包括:
模拟模块,被配置为在Javascript环境中使用主动对象来模拟需要执行的一个或多个任务;以及
调度模块,被配置为使用Javascript自身的事件循环机制对已由所述主动对象模拟的所述一个或多个任务进行执行调度。
9.根据权利要求8所述的设备,还包括:
注册模块,被配置为在所述调度模块进行执行调度之前,将所述主动对象注册到框架中。
10.根据权利要求8所述的设备,还包括:
收发模块,被配置为使所述主动对象接收相关事件,并将接收到的相关事件放入所述主动对象的事件队列中。
11.根据权利要求8所述的设备,还包括:
定时检测模块,被配置为定时检查框架的业务定时器是否触发,
其中,如果触发,所述收发模块使得将所述相关事件加入与所触发的业务定时器对应的主动对象的事件队列中。
12.根据权利要求8所述的设备,还包括:
定时模块,被配置为当所述主动对象接收到所述相关事件时,设置Javascript定时为零的定时器任务,以将所述Javascript定时为零的定时器任务添加到Javascript自身的事件循环队列中,
其中,所述调度模块使用Javascript自身的事件循环机制对所述Javascript定时为零的定时器任务进行执行调度。
13.根据权利要求8-12所述的设备,还包括:
执行模块,被配置为根据所述调度模块进行的执行调度,使所述主动对象从所述主动对象的事件队列取出事件,并根据所述主动对象的当前状态对所取出的事件进行分发处理。
14.根据权利要求13所述的设备,其中,所述执行模块按状态机的方式进行所述分发处理。
CN201510381861.3A 2015-07-02 2015-07-02 实现Javascript多任务机制的方法和设备 Active CN104991823B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510381861.3A CN104991823B (zh) 2015-07-02 2015-07-02 实现Javascript多任务机制的方法和设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510381861.3A CN104991823B (zh) 2015-07-02 2015-07-02 实现Javascript多任务机制的方法和设备

Publications (2)

Publication Number Publication Date
CN104991823A true CN104991823A (zh) 2015-10-21
CN104991823B CN104991823B (zh) 2019-05-17

Family

ID=54303639

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510381861.3A Active CN104991823B (zh) 2015-07-02 2015-07-02 实现Javascript多任务机制的方法和设备

Country Status (1)

Country Link
CN (1) CN104991823B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105426326A (zh) * 2015-11-05 2016-03-23 上海斐讯数据通信技术有限公司 一种实现高并发的队列存储方法及系统
CN105630616A (zh) * 2015-12-28 2016-06-01 北京像素软件科技股份有限公司 高并发连接实现方法和装置
CN107247631A (zh) * 2017-07-04 2017-10-13 深圳市西迪特科技有限公司 通用的gpon‑olt系统板间通信中间件系统
CN109491780A (zh) * 2018-11-23 2019-03-19 鲍金龙 多任务调度方法及装置
CN109684056A (zh) * 2018-12-07 2019-04-26 咪咕文化科技有限公司 一种定时器实现方法及装置、调度器、存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101645084A (zh) * 2009-04-23 2010-02-10 中国科学院声学研究所 一种嵌入式浏览器对动态数据的处理方法
CN102024025A (zh) * 2010-11-12 2011-04-20 电子科技大学 一种移动富媒体应用中大数据量压缩包的解压方法
US20130074080A1 (en) * 2011-09-16 2013-03-21 Skype Limited Timed Iterator

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101645084A (zh) * 2009-04-23 2010-02-10 中国科学院声学研究所 一种嵌入式浏览器对动态数据的处理方法
CN102024025A (zh) * 2010-11-12 2011-04-20 电子科技大学 一种移动富媒体应用中大数据量压缩包的解压方法
US20130074080A1 (en) * 2011-09-16 2013-03-21 Skype Limited Timed Iterator

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
砺能: "Javascript并发模型和事件循环", 《HTTPS://WWW.CNBLOGS.COM/YAKUN/P/3802725.HTML》 *
阮一峰: "JavaScript运行机制之事件循环(Event Loop)详解", 《HTTP://WWW.JB51.NET/ARTICLE/56022.HTM》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105426326A (zh) * 2015-11-05 2016-03-23 上海斐讯数据通信技术有限公司 一种实现高并发的队列存储方法及系统
CN105630616A (zh) * 2015-12-28 2016-06-01 北京像素软件科技股份有限公司 高并发连接实现方法和装置
CN107247631A (zh) * 2017-07-04 2017-10-13 深圳市西迪特科技有限公司 通用的gpon‑olt系统板间通信中间件系统
CN107247631B (zh) * 2017-07-04 2020-07-28 无锡雷华网络技术有限公司 通用的gpon-olt系统板间通信中间件系统
CN109491780A (zh) * 2018-11-23 2019-03-19 鲍金龙 多任务调度方法及装置
CN109491780B (zh) * 2018-11-23 2022-04-12 鲍金龙 多任务调度方法及装置
CN109684056A (zh) * 2018-12-07 2019-04-26 咪咕文化科技有限公司 一种定时器实现方法及装置、调度器、存储介质
CN109684056B (zh) * 2018-12-07 2021-04-13 咪咕文化科技有限公司 一种定时器实现方法及装置、调度器、存储介质

Also Published As

Publication number Publication date
CN104991823B (zh) 2019-05-17

Similar Documents

Publication Publication Date Title
CN111290854B (zh) 任务管理方法、装置、系统、计算机存储介质及电子设备
Garlan et al. Model checking publish-subscribe systems
CN104991823A (zh) 实现Javascript多任务机制的方法和设备
CN109117252B (zh) 基于容器的任务处理的方法、系统及容器集群管理系统
CN102012840A (zh) 一种数据的批量调度方法和系统
US20200167713A1 (en) Business processing method, apparatus, device and system using the same, and readable storage medium of the same
CN101179553A (zh) 用于并行消息的有效保序传递的方法和装置
CN111880948A (zh) 数据刷新方法、装置、电子设备及计算机可读存储介质
CN116382943A (zh) 顺序消息处理方法、总线系统、计算机设备及存储介质
CN101216780A (zh) 在对称多处理体系下实现多实例线程通信的方法及装置
CN103631594A (zh) 通用流程异步调度方法及系统
CN113626163A (zh) 一种轻量级分布式增量自调度方法、系统、设备和介质
CN112825525B (zh) 用于处理事务的方法和装置
CN115361382B (zh) 基于数据群组的数据处理方法、装置、设备和存储介质
CN108446182A (zh) 一种基于共享内存的跨进程通信方法及装置
CN110188258B (zh) 使用爬虫获取外部数据的方法及装置
CN111459510A (zh) 跨网络操作系统的安装方法、装置、电子设备及介质
CN115344644A (zh) 数据同步方法、装置、电子设备和计算机可读存储介质
CN113254143B (zh) 虚拟化网络功能网元编排调度方法、装置和系统
Agarwal et al. Towards an MPI-like framework for the Azure cloud platform
CN112311650B (zh) 一种会话信息加载方法、装置及存储介质
CN113126961B (zh) 流水线处理方法、装置和存储介质
CN110020359B (zh) 应用在网页前端的数据处理方法、装置及存储介质
US9201688B2 (en) Configuration of asynchronous message processing in dataflow networks
CN110909007B (zh) 数据同步方法、数据同步装置、数据同步设备及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant