CN112199201B - 延时任务处理方法、装置和设备 - Google Patents
延时任务处理方法、装置和设备 Download PDFInfo
- Publication number
- CN112199201B CN112199201B CN202011426478.2A CN202011426478A CN112199201B CN 112199201 B CN112199201 B CN 112199201B CN 202011426478 A CN202011426478 A CN 202011426478A CN 112199201 B CN112199201 B CN 112199201B
- Authority
- CN
- China
- Prior art keywords
- task
- delay
- tasks
- time
- executed
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/485—Task life-cycle, e.g. stopping, restarting, resuming execution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例涉及任务处理技术领域,公开了一种延时任务处理方法、装置和设备。该方法包括:设置任务加载线程和任务执行线程;将延时任务***数据库,数据库保存延时任务的任务内容和执行时间;在任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,第二执行时间=执行时间+t2,t2>t1;在任务执行线程中,按内存有序队列中延时任务的排列顺序依次获取延时任务,根据延时任务的执行时间执行延时任务,在延时任务被成功执行后,将数据库中的延时任务删除。通过上述方式,本发明实施例降低了对内存的消耗,且方便横向扩展。
Description
技术领域
本发明实施例涉及任务处理技术领域,具体涉及一种延时任务处理方法、装置和设备。
背景技术
目前,计算机或移动终端等电子设备需要处理大量的任务,包括实时任务和延时任务。关于延时任务,是指在业务逻辑处理中,有些逻辑需要进行延时处理,比如超时关闭直播间、超时自动取消订单、超时发送短信等逻辑,为上述逻辑设置的任务则是延时任务。
现有技术中,大部分延时任务的实现方案一般通过借助Redis有序集合(sortedset)或者本地时间轮算法来实现。但这些方法在任务很多时,对内存的消耗很大。
发明内容
鉴于上述问题,本发明实施例提供了一种延时任务处理方法、装置、设备和计算机可读存储介质,用于解决现有技术中存在的对内存的消耗很大的问题。
根据本发明实施例的一个方面,提供了一种延时任务处理方法,所述方法包括:
设置任务加载线程和任务执行线程;
将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;
在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除。
其中,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,包括:若所述数据库内未来时间t1内需要执行的延时任务数量大于或等于N,则将未来时间t1内需要执行的N个延时任务加载到内存有序队列中;
若所述数据库内未来时间t1内需要执行的延时任务数小于N,则将未来时间t1内需要执行的所有延时任务加载到内存有序队列中。
其中,所述并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间之后,还包括:
判断此次加载的延时任务的数量是否为N;
若此次加载的延时任务的数量为N,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若否,则判断所述数据库中是否还有待执行的延时任务;
若所述数据库中还有待执行的延时任务,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若所述数据库中没有待执行的延时任务,则休眠第一预设时间,所述第一预设时间为所述t1,休眠结束后判断是否结束所述任务加载线程;
若判断结束所述任务加载线程,则结束并退出所述任务加载线程;
若判断不结束所述任务加载线程,则返回执行所述将延时任务***数据库的步骤。
其中,所述根据所述延时任务的执行时间执行所述延时任务,包括:
每隔时间t3,判断所述内存有序队列的第一个任务的所述执行时间是否等于当前时间;
若是,执行所述延时任务。
其中,根据所述延时任务的执行时间执行所述延时任务,还包括:
若判断所述内存有序队列的第一个任务的所述执行时间大于当前时间,则休眠第二预设时间,所述第二预设时间为1s,休眠结束后判断是否结束所述任务执行线程;
若判断结束所述任务执行线程,则结束并退出所述任务执行线程;
若判断不结束所述任务执行线程,则返回执行所述按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务的步骤。
其中,所述方法还包括:
在所述任务执行线程中,若所述延时任务执行失败,不将所述数据库中的所述延时任务删除;
在所述任务加载线程中,当执行失败的所述延时任务的更新后的下次执行时间在所述未来时间t1内时,再次加载执行失败的所述延时任务。
其中,所述任务加载线程包括多个分布式部署的线程;
在每个所述任务加载线程中,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之前,所述方法还包括:
获取分布式锁;
若成功获取所述分布式锁,则执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;所述将未来时间t1内需要执行的延时任务加载到内存有序队列中之后,所述方法还包括:释放所述分布式锁;
若没有获取到所述分布式锁,则经过时间t4后,返回执行所述获取分布式锁的步骤。
本发明实施例还提供了一种延时任务处理装置,所述装置包括:
设置模块,用于设置任务加载线程和任务执行线程;
***模块,用于将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
加载模块,用于在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;
执行模块,用于在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除。
本发明实施例还提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如上所述的延时任务处理方法的操作。
本发明实施例还提供了一种计算机可读存储介质,所述存储介质中存储有至少一可执行指令,所述可执行指令在电子设备上运行时,使得电子设备执行如上所述的延时任务处理方法的操作。
本发明实施例通过为延时任务的加载和执行分别设置任务加载线程和任务执行线程,在任务加载线程中预加载延时任务时,只将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,而不是加载全部的延时任务,降低了内存的消耗。并且在加载完延时任务后,将已加载的延时任务的下次执行时间更新为当前执行时间+t2,也即将其下次执行时间调整到一定时间以后,防止此次执行失败导致该延时任务无法再被执行了,而是在下次执行时间到来时还可以继续执行该延时任务。
此外,通过分两个线程分别进行任务加载和执行的方式,方便对任务加载线程单独进行分布式部署,方便了横向扩展。
上述说明仅是本发明实施例技术方案的概述,为了能够更清楚了解本发明实施例的技术手段,而可依照说明书的内容予以实施,并且为了让本发明实施例的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
附图仅用于示出实施方式,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的延时任务处理方法的流程图;
图2示出了本发明实施例提供的延时任务处理装置的结构示意图;
图3示出了本发明实施例提供的电子设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。
图1示出了本发明实施例提供的延时任务处理方法的流程图,该方法由需要进行延时任务处理的设备执行,例如服务器、计算机、手机、平板电脑等电子设备。如图1所示,该方法包括以下步骤:
步骤110:设置任务加载线程和任务执行线程;
本步骤为延时任务的加载和执行分别设置两个进程:任务加载线程和任务执行线程,这样,任务的加载和任务的执行互不影响,可以单独进行。延时任务可以包括超时关闭直播间、超时自动取消订单、超时发送短信等任务,这些任务一般都设置有超时的时间,超过该时间没有获得某个输入,则执行该延时任务。
步骤120:将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
本步骤可以将所有的需要执行的延时任务均***数据库。具体的,可以在数据库中新建表实体,用于存储延时任务。表实体中主要存储两个信息,延时任务的任务内容和执行时间。其中,任务内容用于描述任务是做什么的,例如超时关闭直播间的延时任务的任务内容是关闭直播间,超时自动取消订单的延时任务的任务内容是取消订单,超时发送短信的延时任务的任务内容是发送短信。任务内容中还需携带该任务针对的事件编号或对象编号,例如直播间编号,订单编号,短信接收方号码等。执行时间是指超时的具体时间,也称为延时时长,例如超时关闭直播间的执行时间是5分钟,也即5分钟内主播没有顺利进入直播间则关闭直播间;超时自动取消订单的执行时间是15分钟,也即15分钟内没有支付该订单则取消该订单;超时发送短信的执行时间是1分钟,也即1分钟内没有输入验证码则重新发送验证码短信,等等。执行时间具体表现为任务起算时间加上延时时长,例如任务起算时间为10时18分00秒,延时时长为15分钟,则执行时间为10时33分00秒。
表实体可按如下方式建立:
表1
序号 | 任务内容 | 执行时间 |
1 | 取消订单0001# | 10时33分00秒 |
2 | 取消订单0002# | 10时35分15秒 |
3 | 取消订单0003# | 10时36分12秒 |
…… | …… | …… |
步骤130:在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;
本步骤为任务加载线程操作的步骤。其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;
在任务加载线程中,需要将未来某个时间段内需要执行的延时任务加载到内存有序队列中。N可以根据内存的容量设置。例如内存若加载100个延时任务,不会影响内存中其他任务的处理效率,则可以将N设置为100。此外,N还可以根据未来时间t1设置,例如,每次加载时,未来时间t1内需要执行的延时任务的数量的最大值为A,则可以将N设置为A,这样保证每次加载的延时任务可以覆盖到未来时间t1内需要被执行的所有延时任务,而不会导致有延时任务未能被加载,影响延时任务的顺利执行。其中,N为正整数。
当然,未来时间t1可以反过来根据N设置。例如N为100,t1则设置为第一批100个延时任务的执行时间中最大的执行时间,例如第一批100个延时任务的执行时间中最大的执行时间为5s(程序中执行时间为具体的时间点,例如17点50分,此处的5s是指当前时间距离执行时间的时长,例如当前时间为17点45分,则当前时间距离执行时间的时长为5s),则将t1设置为5s。这样保证每次加载的延时任务可以覆盖到未来时间t1内需要被执行的所有延时任务,而不会导致有延时任务未能被加载,影响延时任务的顺利执行。当然,t1还可以根据人们经验数值确定,例如一般加载未来5s内需要执行的延时任务,是内存可以容纳的,则将t1设置为5s。
此外,还可以每间隔固定时间进行延时任务的加载。间隔的固定时间可以和未来时间t1相同。
数据库中存储的延时任务并不一定是N的整数倍,则最后一次加载的延时任务的数量不一定都能等于N。因此,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,包括:
步骤a1:其中,若所述数据库内未来时间t1内需要执行的延时任务数量大于或等于N,则将未来时间t1内需要执行的N个延时任务加载到内存有序队列中;
例如,数据库中存储的延时任务总数量为480个,N为100,t1为5s。第一次至第四次中每次加载时,未来5s内需要执行的延时任务数量刚好为100个,因此第一次至第四次每次都可以每次加载100个延时任务,也即加载延时任务的数量为N。
步骤a2:若所述数据库内未来时间t1内需要执行的延时任务数小于N,则将未来时间t1内需要执行的所有延时任务加载到内存有序队列中。
第五次加载延时任务时,数据库中仅剩下80个延时任务,若未来5s内这80个延时任务均需要加载,则将该80个延时任务全部加载到内存有序队列中。此时,80少于100(N)而非等于100。
在一些实施例中,若最后一次加载的延时任务的数量不为N而是小于N,则说明经过此次加载,数据库中的延时任务均已完全加载完毕,可以休眠直至有新的延时任务***数据库。因此,在并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间之后,该方法还包括如下步骤:
步骤b1:判断此次加载的延时任务的数量是否为N;
步骤b2:若此次加载的延时任务的数量为N,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
如果当前加载的延时任务的数量是N,则说明数据库中还有需要执行的延时任务,则需要继续加载延时任务。当然,也可能数据库中延时任务的总数刚好是N的整数倍,此时有可能数据库中已经没有了需要执行的延时任务,若没有延时任务了,则没有可供加载的延时任务。执行本步骤可以保证数据库中的延时任务都能被加载而没有遗漏。
步骤b3:若否,则判断所述数据库中是否还有待执行的延时任务;
若某次加载步骤中,加载的延时任务的数量不是N(小于N),有两种可能:
1. 此次需要加载的未来时间t1内需要执行的延时任务本来就不足N个,除此以外数据库中还有未被加载的延时任务,这些延时任务的执行时间超过了t1;
2. 此次需要加载的未来t1内需要执行的延时任务不足N个,且除此以外数据库中没有未被加载的延时任务。
对于第1种情况,判断结果为数据库中还有待执行的延时任务;对于第2种情况,判断结果为数据库中没有待执行的延时任务。
步骤b4:若所述数据库中还有待执行的延时任务,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
因为数据库中还有待执行的延时任务,所以需要继续加载。
步骤b5:若所述数据库中没有待执行的延时任务,则休眠第一预设时间,所述第一预设时间为所述t1,休眠结束后判断是否结束所述任务加载线程;如果当前加载的延时任务的数量不是N,而是比N小的数量,且数据库中已没有待执行的延时任务,则说明已经是加载的数据库中全部的延时任务,此时可以将任务加载本线程休眠。
步骤b6:若判断结束所述任务加载线程,则结束并退出所述任务加载线程;
当出现断电、服务器升级等情况时,需要结束任务加载线程。
步骤b7:若判断不结束所述任务加载线程,则返回执行所述将延时任务***数据库的步骤。
若没有出现断电、服务器升级等情况,无需结束任务加载线程。此时可继续往数据库中***新的延时任务,循环处理任务加载流程。
其中,延时任务的下次执行时间是指若某个延时任务此次未被执行成功,该延时任务在下一次被继续执行的时间。第二执行时间=执行时间+t2,执行时间是指该任务此次被加载时的执行时间。t2的取值需要大于t1,使该任务如在此次记载后若没有成功执行,保证其可以在后续加载任务时可以被继续加载并被执行。例如,t1为5s,t2为15s,在任务加载线程中,第一次加载时将未来5s内需要执行的100个延时任务加载到内存有序队列中,同时将这100个延时任务的下次执行时间增加15s。如果100个延时任务中有3个未被成功执行,这3个任务将在数据库中保留,不被删除。第二次和第三次加载时将当前时间的未来5s内需要执行的100个延时任务加载到内存有序队列中。此前的3个未被执行的任务由于下次执行时间被调整为15s后,因此在第四次加载时这3个未被执行的任务属于当前时间的未来5s内需要执行的任务,其将被加载。
如果t2的取值小于或等于t1,则无法保证该任务可以在后续加载任务时被继续加载。例如,某延时任务的执行时间为10分31秒,t1为5s,t2为3s,在10分30秒时,加载未来5s需要被执行的任务,该延时任务将被加载,并将其下次执行时间修改为10分34秒。若其未被执行成功,而下一次加载任务的时间是10分35秒,该任务不属于未来5s内需要执行的任务,因此其将不会被加载,从而不能被顺利执行。
因为本发明实施例将延时任务加载和执行分为两个独立的线程,因此可以方便进行分布式部署,主要是针对任务加载线程进行分布式部署。在一些实施例中,所述任务加载线程包括多个分布式部署的线程;在每个所述任务加载线程中,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之前,该方法还包括如下步骤:
步骤c1:获取分布式锁;
为了防止分布式***中的多个线程之间相互干扰,可以采用分布式协调技术对这些线程进行调度。分布式锁可以使在分布式***环境下,一个方法在同一时间只能被一个机器的一个线程执行。也即虽然有多个任务加载线程,但是同一时间只有获取分布式锁的任务加载线程才可以进行任务加载。例如可以使setnx命令,key是锁的唯一标识。当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到了锁;当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败。
步骤c2:若成功获取所述分布式锁,则执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之后,所述方法还包括:释放所述分布式锁;
若某个任务加载线程成功获取到分布式锁,则可以执行任务加载。当得到锁的线程执行完任务,需要释放锁,以便其他线程可以进入。例如可执行del指令释放分布式锁。释放分布式锁后,其他线程就可以继续执行setnx命令来获得分布式锁。
步骤c3:若没有获取到所述分布式锁,则经过时间t4后,返回执行所述获取分布式锁的步骤。
若某个任务加载线程没有获取到所述分布式锁,说明此时有别的任务加载线程正拥有分布式锁,可以等待一设定时间t4后,再继续获取分布式锁。
步骤140:在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除。
其中,执行延时任务为异步处理,处理速度很快。
在一些实施例中,所述根据所述延时任务的执行时间执行所述延时任务,包括:
步骤d1:每隔时间t3,判断所述内存有序队列的第一个任务的所述执行时间是否等于当前时间;
这里,t3可以是时间的最小单位,例如1s,使得不会错过延时任务的执行时间。
步骤d2:若是,执行所述延时任务。
当内存有序队列的第一个任务的所述执行时间等于当前时间,说明此时可以执行该延时任务,因此可以立即执行。若所述内存有序队列的第一个任务的所述执行时间不等于当前时间,一般会大于当前时间,说明该延时任务还未到执行时间,可以不予执行。
在一些实施例中,当所述内存有序队列的第一个任务的所述执行时间不等于当前时间时,该根据所述延时任务的执行时间执行所述延时任务的步骤,还包括:
步骤e1:若判断所述内存有序队列的第一个任务的所述执行时间大于所述当前时间,则休眠第二预设时间,所述第二预设时间为1s,休眠结束后判断是否结束所述任务执行线程;
由于还未到该延时任务的执行时间,所以可以将当前任务执行线程休眠第二预设时间,第二预设时间可以是时间的最小单位1s,使得不会错过延时任务的执行时间。
步骤e2:若判断结束所述任务执行线程,则结束并退出所述任务执行线程;
当出现断电、服务器升级等情况时,需要结束任务执行线程。
步骤e3:若判断不结束所述任务执行线程,则返回执行所述按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务的步骤。
若没有出现断电、服务器升级等情况,无需结束任务执行线程。此时可继续进行任务执行,循环处理任务执行流程。
在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除。若延时任务执行失败,则不能删除数据库中的该任务,因为还需要等待下一次执行,下一次执行时间为对该任务进行更新后的为第二执行时间。因此,在一些实施例中,所述方法还包括:
步骤f1:在所述任务执行线程中,若所述延时任务执行失败,不将所述数据库中的所述延时任务删除;
步骤f2:在所述任务加载线程中,当执行失败的所述延时任务的更新后的下次执行时间在所述未来时间t1内时,再次加载执行失败的所述延时任务。
例如,该延时任务的执行时间为17时30分30秒,加载到内存后该任务的下次执行时间更新为17时30分45秒;若该任务执行成功,则在数据库中删除该延时任务,下次无需再次执行;若该任务执行失败,t1为5s,则在17时30分40秒时,将再次加载该延时任务。
本发明实施例通过为延时任务的加载和执行分别设置任务加载线程和任务执行线程,在任务加载线程中预加载延时任务时,只将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,而不是加载全部的延时任务,降低了内存的消耗。并且在加载完延时任务后,将已加载的延时任务的下次执行时间更新为当前执行时间+t2,也即将其下次执行时间调整到一定时间以后,防止此次执行失败导致该延时任务无法再被执行了,而是在下次执行时间到来时还可以继续执行该延时任务。此外,通过分两个线程分别进行任务加载和执行的方式,方便对任务加载线程单独进行分布式部署,方便了横向扩展。
图2示出了本发明实施例提供的延时任务处理装置的结构示意图。如图2所示,该装置300包括:
设置模块310,用于设置任务加载线程和任务执行线程;
***模块320,用于将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
加载模块330,用于在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;
执行模块340,用于在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除。
在一种可选的方式中,所述加载模块330,还用于:
若所述数据库内未来时间t1内需要执行的延时任务数量大于或等于N,则将未来时间t1内需要执行的N个延时任务加载到内存有序队列中;
若所述数据库内未来时间t1内需要执行的延时任务数小于N,则将未来时间t1内需要执行的所有延时任务加载到内存有序队列中。
在一种可选的方式中,所述加载模块330在执行并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间之后,还用于:
判断此次加载的延时任务的数量是否为N;
若是,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若否,则休眠第一预设时间,所述第一预设时间为所述t1,休眠结束后判断是否结束所述任务加载线程;
若判断结束所述任务加载线程,则结束并退出所述任务加载线程;
若判断不结束所述任务加载线程,则返回执行所述将延时任务***数据库的步骤。
在一种可选的方式中,所述执行模块340,还用于:
每隔时间t3,判断所述内存有序队列的第一个任务的所述执行时间是否等于当前时间;
若是,执行所述延时任务。
在一种可选的方式中,所述执行模块340,还用于:
若判断所述内存有序队列的第一个任务的所述执行时间大于所述当前时间,则休眠第二预设时间,所述第二预设时间为1s,休眠结束后判断是否结束所述任务执行线程;
若判断结束所述任务执行线程,则结束并退出所述任务执行线程;
若判断不结束所述任务执行线程,则返回执行所述按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务的步骤。
在一种可选的方式中,所述执行模块340,还用于:
在所述任务执行线程中,若所述延时任务执行失败,不将所述数据库中的所述延时任务删除;
在所述任务加载线程中,当执行失败的所述延时任务的更新后的下次执行时间在所述未来时间t1内时,再次加载执行失败的所述延时任务。
在一种可选的方式中,所述任务加载线程包括多个分布式部署的线程;
所述加载模块330,还用于:
在每个所述任务加载线程中,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之前,获取分布式锁;
若成功获取所述分布式锁,则执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之后,释放所述分布式锁;
若没有获取到所述分布式锁,则经过时间t4后,返回执行所述获取分布式锁的步骤。
本发明实施例通过为延时任务的加载和执行分别设置任务加载线程和任务执行线程,在任务加载线程中预加载延时任务时,只将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,而不是加载全部的延时任务,降低了内存的消耗。并且在加载完延时任务后,将已加载的延时任务的下次执行时间更新为当前执行时间+t2,也即将其下次执行时间调整到一定时间以后,防止此次执行失败导致该延时任务无法再被执行了,而是在下次执行时间到来时还可以继续执行该延时任务。此外,通过分两个线程分别进行任务加载和执行的方式,方便对任务加载线程单独进行分布式部署,方便了横向扩展。
图3示出了本发明实施例提供的电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。
如图3所示,该电子设备可以包括:处理器(processor)402、通信接口(Communications Interface)404、存储器(memory)406、以及通信总线408。
其中:处理器402、通信接口404、以及存储器406通过通信总线408完成相互间的通信。通信接口404,用于与其它设备比如客户端或其它服务器等的网元通信。处理器402,用于执行程序410,具体可以执行上述用于延时任务处理方法实施例中的相关步骤。
具体地,程序410可以包括程序代码,该程序代码包括计算机可执行指令。
处理器402可能是中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器406,用于存放程序410。存储器406可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
本发明实施例提供了一种计算机可读存储介质,所述存储介质存储有至少一可执行指令,该可执行指令在电子设备上运行时,使得所述电子设备执行上述任意方法实施例中的延时任务处理方法。
本发明实施例提供一种延时任务处理装置,用于执行上述延时任务处理方法。
本发明实施例提供了一种计算机程序,所述计算机程序可被处理器调用使电子设备执行上述任意方法实施例中的延时任务处理方法。
本发明实施例提供了一种计算机程序产品,计算机程序产品包括存储在计算机可读存储介质上的计算机程序,计算机程序包括程序指令,当程序指令在计算机上运行时,使得所述计算机执行上述任意方法实施例中的延时任务处理方法。
在此提供的算法或显示不与任何特定计算机、虚拟***或者其它设备固有相关。各种通用***也可以与基于在此的示教一起使用。根据上面的描述,构造这类***所要求的结构是显而易见的。此外,本发明实施例也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本发明并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明实施例的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。
本领域技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。上述实施例中的步骤,除有特殊说明外,不应理解为对执行顺序的限定。
Claims (8)
1.一种延时任务处理方法,其特征在于,所述方法包括:
设置任务加载线程和任务执行线程;
将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;t1为每一批N个延时任务的执行时间中最大的执行时间;
在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除;
所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,包括:若所述数据库内未来时间t1内需要执行的延时任务数量等于N,则将未来时间t1内需要执行的N个延时任务加载到内存有序队列中;
若所述数据库内未来时间t1内需要执行的延时任务数小于N,则将未来时间t1内需要执行的所有延时任务加载到内存有序队列中;
所述并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间之后,还包括:
判断此次加载的延时任务的数量是否为N;
若此次加载的延时任务的数量为N,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若否,则判断所述数据库中是否还有待执行的延时任务;
若所述数据库中还有待执行的延时任务,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若所述数据库中没有待执行的延时任务,则休眠第一预设时间,所述第一预设时间为所述t1,休眠结束后判断是否结束所述任务加载线程;
若判断结束所述任务加载线程,则结束并退出所述任务加载线程;
若判断不结束所述任务加载线程,则返回执行所述将延时任务***数据库的步骤。
2.根据权利要求1所述的方法,其特征在于,所述根据所述延时任务的执行时间执行所述延时任务,包括:
每隔时间t3,判断所述内存有序队列的第一个任务的所述执行时间是否等于当前时间;
若是,执行所述延时任务。
3.根据权利要求1所述的方法,其特征在于,根据所述延时任务的执行时间执行所述延时任务,还包括:
若判断所述内存有序队列的第一个任务的所述执行时间大于当前时间,则休眠第二预设时间,所述第二预设时间为1s,休眠结束后判断是否结束所述任务执行线程;
若判断结束所述任务执行线程,则结束并退出所述任务执行线程;
若判断不结束所述任务执行线程,则返回执行所述按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务的步骤。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述任务执行线程中,若所述延时任务执行失败,不将所述数据库中的所述延时任务删除;
在所述任务加载线程中,当执行失败的所述延时任务的更新后的下次执行时间在所述未来时间t1内时,再次加载执行失败的所述延时任务。
5.根据权利要求1所述的方法,其特征在于,所述任务加载线程包括多个分布式部署的线程;
在每个所述任务加载线程中,所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之前,所述方法还包括:
获取分布式锁;
若成功获取所述分布式锁,则执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中之后,所述方法还包括:释放所述分布式锁;
若没有获取到所述分布式锁,则经过时间t4后,返回执行所述获取分布式锁的步骤。
6.一种延时任务处理装置,其特征在于,所述装置包括:
设置模块,用于设置任务加载线程和任务执行线程;
***模块,用于将延时任务***数据库,所述数据库保存所述延时任务的任务内容和执行时间;
加载模块,用于在所述任务加载线程中,将未来时间t1内需要执行的N个延时任务加载到内存有序队列中,并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间,其中,所述第二执行时间=执行时间+t2,t2>t1;其中,每次加载的所述延时任务的数量大于或等于未来时间t1内需要被执行的所有延时任务的数量;t1为每一批N个延时任务的执行时间中最大的执行时间;
执行模块,用于在所述任务执行线程中,按所述内存有序队列中延时任务的排列顺序依次获取所述延时任务,根据所述延时任务的执行时间执行所述延时任务,在所述延时任务被成功执行后,将所述数据库中的所述延时任务删除;
所述加载模块还用于:
若所述数据库内未来时间t1内需要执行的延时任务数量大于或等于N,则将未来时间t1内需要执行的N个延时任务加载到内存有序队列中;
若所述数据库内未来时间t1内需要执行的延时任务数小于N,则将未来时间t1内需要执行的所有延时任务加载到内存有序队列中;
所述加载模块在执行并将加载到所述内存有序队列中的延时任务的下次执行时间更新为第二执行时间之后,还用于:
判断此次加载的延时任务的数量是否为N;
若是,则返回执行所述将未来时间t1内需要执行的N个延时任务加载到内存有序队列中的步骤;
若否,则休眠第一预设时间,所述第一预设时间为所述t1,休眠结束后判断是否结束所述任务加载线程;
若判断结束所述任务加载线程,则结束并退出所述任务加载线程;
若判断不结束所述任务加载线程,则返回执行所述将延时任务***数据库的步骤。
7.一种电子设备,其特征在于,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如权利要求1-5任意一项所述的延时任务处理方法的操作。
8.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一可执行指令,所述可执行指令在电子设备上运行时,使得电子设备执行如权利要求1-5任意一项所述的延时任务处理方法的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011426478.2A CN112199201B (zh) | 2020-12-09 | 2020-12-09 | 延时任务处理方法、装置和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011426478.2A CN112199201B (zh) | 2020-12-09 | 2020-12-09 | 延时任务处理方法、装置和设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112199201A CN112199201A (zh) | 2021-01-08 |
CN112199201B true CN112199201B (zh) | 2021-03-16 |
Family
ID=74033861
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011426478.2A Active CN112199201B (zh) | 2020-12-09 | 2020-12-09 | 延时任务处理方法、装置和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112199201B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109325002A (zh) * | 2018-09-03 | 2019-02-12 | 北京京东金融科技控股有限公司 | 文本文件处理方法、装置、***、电子设备、存储介质 |
CN110515709A (zh) * | 2019-07-25 | 2019-11-29 | 北京达佳互联信息技术有限公司 | 任务调度***、方法、装置、电子设备及存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011076304A (ja) * | 2009-09-30 | 2011-04-14 | Hitachi Ltd | ジョブ割当装置、ジョブ割当方法およびジョブ割当プログラム |
CN102629220A (zh) * | 2012-03-08 | 2012-08-08 | 北京神州数码思特奇信息技术股份有限公司 | 一种动态任务分配管理方法 |
CN109766194B (zh) * | 2018-11-29 | 2021-02-05 | 南瑞集团有限公司 | 基于消息的低耦合计划任务组件的实现方法及其*** |
-
2020
- 2020-12-09 CN CN202011426478.2A patent/CN112199201B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109325002A (zh) * | 2018-09-03 | 2019-02-12 | 北京京东金融科技控股有限公司 | 文本文件处理方法、装置、***、电子设备、存储介质 |
CN110515709A (zh) * | 2019-07-25 | 2019-11-29 | 北京达佳互联信息技术有限公司 | 任务调度***、方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112199201A (zh) | 2021-01-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107450971B (zh) | 任务处理方法及装置 | |
CN107153643B (zh) | 数据表连接方法及装置 | |
CN111381972A (zh) | 分布式任务调度方法、装置和*** | |
CN111897633A (zh) | 一种任务处理的方法和装置 | |
CN109918187B (zh) | 任务调度方法、装置、设备和存储介质 | |
CN112865992B (zh) | 分布式主从***中主节点的切换方法、装置和计算机设备 | |
CN111708586A (zh) | 应用启动配置项加载方法、装置、计算机设备和存储介质 | |
CN112199201B (zh) | 延时任务处理方法、装置和设备 | |
CN109542922B (zh) | 针对实时服务数据的处理方法及相关*** | |
CN113778650A (zh) | 任务调度方法、装置、电子设备及存储介质 | |
CN114564281A (zh) | 容器调度方法、装置、设备及存储介质 | |
CN108536541B (zh) | 流程引擎对象处理方法及装置 | |
US9864771B2 (en) | Method and server for synchronizing a plurality of clients accessing a database | |
CN111880910A (zh) | 数据处理方法及装置、服务器及存储介质 | |
US20230053933A1 (en) | Techniques for improving resource utilization in a microservices architecture via priority queues | |
CN108804214B (zh) | 一种异步任务的调度方法、装置以及电子设备 | |
CN112217849B (zh) | Sd-wan***中的任务调度方法、***和计算机设备 | |
CN111258728A (zh) | 任务的执行方法及装置、存储介质和电子装置 | |
CN113535338A (zh) | 用于数据接入的交互方法、***、存储介质及电子设备 | |
CN112395057A (zh) | 基于定时任务的数据处理方法、装置、计算机设备 | |
CN112541041A (zh) | 一种数据处理方法、装置、服务器及存储介质 | |
CN111159236A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN113703874B (zh) | 一种数据流处理方法、装置、设备及可读存储介质 | |
CN118093214B (zh) | 一种搬运任务调度方法、装置、电子设备和存储介质 | |
CN113238862B (zh) | 一种分布式任务调度方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |