CN111796922B - 一种基于编程语言分批调度任务的方法 - Google Patents

一种基于编程语言分批调度任务的方法 Download PDF

Info

Publication number
CN111796922B
CN111796922B CN202010662645.7A CN202010662645A CN111796922B CN 111796922 B CN111796922 B CN 111796922B CN 202010662645 A CN202010662645 A CN 202010662645A CN 111796922 B CN111796922 B CN 111796922B
Authority
CN
China
Prior art keywords
task
links
loop
value
upper limit
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
Application number
CN202010662645.7A
Other languages
English (en)
Other versions
CN111796922A (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.)
Sichuan Changhong Electric Co Ltd
Original Assignee
Sichuan Changhong Electric 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 Sichuan Changhong Electric Co Ltd filed Critical Sichuan Changhong Electric Co Ltd
Priority to CN202010662645.7A priority Critical patent/CN111796922B/zh
Publication of CN111796922A publication Critical patent/CN111796922A/zh
Application granted granted Critical
Publication of CN111796922B publication Critical patent/CN111796922B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • G06F16/258Data format conversion from or to a database

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于编程语言分批调度任务的方法,包括从目标网页获取***,分批创建链接,分析同类链接的规律,并通过上限跟随算法进行分批创建并执行,并将链接存入mongoDB数据库中,通过任务执行结果,对数据库中的链接进行更新。本发明通过循环嵌套对协程任务的创建实行分批创建,优化了协程任务创建所占用的内存,有效减少了协程任务中断导致返回结果失败,造成业务处理及时间的损失;通过将字符串进行转换,作为KEY值直接存入数据库中,有效缩短了任务处理所需必要字符串的检索时间,从而提高完成协程任务的稳定性及效率。

Description

一种基于编程语言分批调度任务的方法
技术领域
本发明涉及计算机软件技术领域,特别涉及一种基于编程语言分批调度任务的方法。
背景技术
协程属于轻量级的线程,它的调度切换比多线程以及多进程更加快捷。但是协程的执行方式是执行完所有任务的未阻塞部分,等全部任务未阻塞部分执行结束后再统一返回所有任务的执行结果。在协程执行任务的过程中,需要先将特定的字符串存储在数据库中,当需要时,再从数据库中获取,实例化协程。字符串的数量较多时,此过程将占用大量的存储空间。再者,当非阻塞部分全部执行结束,返回执行结果,并将执行结果通过遍历的方式对数据库进行更新。当任务量非常大又需要控制执行频率时,协程执行任务所耗费的时间较长;当执行未阻塞部分工作时,因网络或者其他外部因素导致程序出错,那么之前的任务处理将全部返回失败,如此便浪费了大量时间,且造成了再次处理业务的服务器压力。
发明内容
为解决现有技术中存在的问题,本发明的目的是提供一种基于编程语言分批调度任务的方法,解决协程执行大批量任务时,耗费时间较长,容易因网络或其他因素导致程序出错,浪费时间且造成服务器负担的技术问题。
为实现上述目的,本发明采用的技术方案是:
一种基于编程语言分批调度任务的方法,其特征在于,包括以下步骤:
步骤A、分批创建链接,从目标网页获取***,分析同类链接的规律,并通过上限跟随算法进行分批创建;
步骤B、将链接存入mongoDB数据库中;
步骤C、分批创建任务并执行;
步骤D、更新数据库,根据任务执行结果,对数据库中的链接进行更新;
步骤E、全部任务执行完毕,结束。
进一步地,所述分批创建的任务为协程任务。
进一步地,所述步骤C中,当链接创建完成一批,协程直接获取该批链接,并实例化异步协程对象,将多个链接放入ensure_future()函数的执行爬虫访问任务中,开始执行协程任务。
进一步地,所述步骤B中,链接通过re.sub()函数进行转换,并以dict形式将链接作为key值进行储存。
进一步地,所述步骤D包括:首先通过find()函数查询数据,获取key值;并通过list()将key值进行转换,获取链接;将链接字符串通过re.sub()函数进行恢复,从而完成对链接的更新。
进一步地,所述步骤E包括:当一批任务执行完后,判断是否完成全部任务;若否,则重复上述步骤A-D,重新进行创建任务并执行,至全部任务执行完毕。
进一步地,所述上限跟随算法为:
①、初始化四个变量,包括初始值a、最终值b、分批尺度h和上限跟随值g;所述上限跟随值用于动态修改for循环的上限;
②、通过while循环进行判断,当初始值a≤最终值b时,开始执行创建;
③、通过while循环内部的if判断,当上限跟随值g>最终值b时,将上限跟随值g修改为最终值b+1;
④、与if同级添加for循环,通过for循环设定下限为初始值a,上限为上限跟随值g,for循环内部为批量创建的任务,for循环同级的下一条语句为执行函数,通过执行函数执行任务;
⑤、完成所有链接的分批创建。
进一步地,所述分批调度任务的方法通过循环嵌套实现,通过对循环嵌套的内层循环设定变量,并将执行函数放置于循环嵌套的外层循环中,使循环嵌套在执行完一层循环进入下一层循环时,自动更新内层循环的上下限,完成链接的分批创建。
本发明的有益效果是:
通过分批创建链接及任务,创建任务时直接获取链接,优化了协程任务创建所占用的内存,有效减少了协程工作时由于中断导致返回失败,造成业务处理及时间损失,保证了数据获取的安全性。
通过将字符串转换为KEY值存入数据库,有效缩短了任务处理所需必要字符串的检索时间,提高了数据库的更新速度。
附图说明
图1为本发明实施例的基于编程语言分批调度任务的方法流程图。
图2为本发明实施例的一次性执行协程任务的示意图。
图3为本发明实施例的分批执行协程任务的示意图。
具体实施方式
以下描述用于揭露本发明以使相关领域技术人员能够实现本发明。以下描述中的实施例只作为举例,相关领域技术人员可以想到其他显而易见的变型均属于本发明的保护范围。
在编程语言中,循环嵌套是批量处理指令常用的方法,对于一定规律的字符串也可以使用循环嵌套进行生成。首先,对内层循环设定变量,利用上下限随变量变化的特点,使循环嵌套在执行完一层循环进入下一层循环后,自动更新内层循环的上下限,达到内层循环的上下限根据外层循环进行上下限跟进的效果,完成任务的分批创建。并改进循环嵌套的算法,将执行函数设置于循环嵌套的外层循环中,相当于在循环嵌套中开辟了一个执行空间,执行分批的任务。通过内层循环创建完一批任务,外层循环进行执行,再进入下一批任务的创建与执行,从而实现任务的分批调度。
在其中一个实施例中,如图1所示,一种基于编程语言分批调度任务的方法,具体步骤如下:
步骤A、分批创建链接;
从目标网页获取***,分析同类链接的规律,并通过上限跟随算法进行分批创建。
步骤B、将创建的链接放入mongoDB数据库中;
将分批创建的链接存入执行空间的数据库中,import导入re模块,通过re.sub()函数进行转换,以dict形式将链接作为key值进行储存,dict中key值对应的value值可以定义为可检索到的任意值。例如,将链接的字符“.”转换为其他不常见的标识符“##”。
数据库直接通过key值进行存储,然后对KEY值进行检索比遍历匹配value值速度更快,受文档数量影响极小,通过此方法能够缩短数据库的更新速度,避免更新过程占用大量的运行空间。
步骤C、分批创建并执行协程任务;
当链接创建完成一批,协程直接获取该批链接,并实例化异步协程对象,将多个链接放入ensure_future()函数的执行爬虫访问任务中,开始执行协程任务。当该批任务执行完毕,将执行结果返回数据库,并对数据库中的字符进行更新。
步骤D、更新数据库;
访问数据库,通过find()函数查询数据,循环输出单条文档,再通过keys()获取每条文档的key值,用list()方法将每条文档key值转换为list,并获取链接,再将链接字符串通过re.sub()函数恢复链接。例如,将标识符转换回“.”,将便恢复了链接。再根据执行结果,对数据库中的链接进行更新。
步骤E、执行完毕;
当执行空间中的该批任务执行完毕后,通过上限跟随法进行判断,是否完成全部任务。若否,则重复上述步骤A-D,重新进行创建任务并执行;若是,则全部协程任务执行完毕。
通过基于编程语言分批调度任务的方法,设定创建字符串的初始值、上限值,获取指定数量的不同字符串,将字符串存入外层循环执行空间的数据库中,并开始创建协程任务并执行。等待外层循环下一次循环的创建命令,当执行空间的该批任务处理完后,进入外层循环的下一次循环;至达到上限值并执行完毕后跳出外循环,完成所有分批调度任务。相应的,通过此分批调度任务的方法不仅适应于协程任务,例如线程任务或者其他任务,均能够通过该方法进行分批调度任务。
所述上限跟随算法的具体为:
①、初始化四个变量,包括初始值a、最终值b、分批尺度h和上限跟随值g。其中初始值a为开始的数值,最终值b为编号最大的数值,分批尺度h为创建一批任务的数量,上限跟随值为初始值加分批尺度,即g=a+h,用于动态修改for循环的上限。
②、通过while循环进行判断,当初始值a≤最终值b时,开始执行创建,否则,不执行创建。
③、通过while循环内部的if判断,当上限跟随值g>最终值b时,将上限跟随值g修改为最终值b+1。
④、与if同级添加for循环,通过for循环设定下限为初始值a,上限为上限跟随值g,for循环内部为批量创建的任务,for循环同级的下一条语句便是开辟的执行空间,进行任务的执行。
⑤、然后,将起始值a和上限跟随值b都加上分批尺度h的数值。重复上述判断过程②-④,至完成所有链接的分批创建。
通过该上限跟随算法,当执行完一批任务后,会通过while循环判断是否执行完毕,并重新开始分配任务,只需要在开辟的执行空间处添加需要执行的任务即可。
在另一个实施例中,若协程需要访问123个链接,协程请求一个链接消耗的时间是1秒,每次任务阻塞时间是9秒。
如图2所示,通过一次性执行协程任务,请求耗时123秒,堵塞耗时9秒,总共等待时间是132秒。
如图3所示,通过分批执行协程任务,一批访问30个链接,即,a=0,b=123、h=30。其中123个链接被分成5批,其中4批链接数为30个,1批链接数为剩余的3个,请求耗时123秒,阻塞耗时45秒,共等待时间是168秒。
总耗时计算公式为:链接数量*每次请求耗时+单次阻塞时间*总批次
若出现网络问题,通过一次性执行协程任务会全部返回失败,并且数据只有在请求完后才能获取。通过分批执行协程任务,则只会影响到正在执行的一批任务,之前已经完成的批次的任务则不会受到影响,且之前完成访问的任务数据已经获取,避免了网络问题造成的全部数据返回失败。分批越少耗时越少,但是会加大数据丢失的风险,适用于处理大量协程任务,保证数据获取的安全性。
通过本发明的基于编程语言分批调度任务的方法,将执行空间结合在循环嵌套中,由于循环函数的循环次数上限大大高于递归函数的递归次数上限,且通过结合的执行空间,可以直接进行重复创建和执行,可以替代递归函数的功能,并解决递归函数因堆栈容易溢出的问题。对任务的创建实行分批创建,减小协程单批执行任务的数量,提高数据获取效率。并优化了协程任务创建所占用的内存,有效减少了协程工作时由于中断导致返回失败,造成业务处理及时间损失。将字符串通过转换的方式,直接存入数据库,有效缩短了任务处理所需必要字符串的检索时间,提高了数据库的更新速度。
以上所述实施例仅表达了本发明的具体实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。

Claims (2)

1.一种基于编程语言分批调度任务的方法,其特征在于,包括以下步骤:
步骤A、分批创建链接,从目标网页获取***,分析同类链接的规律,并通过上限跟随算法进行分批创建;
所述上限跟随算法为:
①、初始化四个变量,包括初始值a、最终值b、分批尺度h和上限跟随值g;所述上限跟随值用于动态修改for循环的上限;
②、通过while循环进行判断,当初始值a≤最终值b时,开始执行创建;
③、通过while循环内部的if判断,当上限跟随值g>最终值b时,将上限跟随值g修改为最终值b+1;
④、与if同级添加for循环,通过for循环设定下限为初始值a,上限为上限跟随值g,for循环内部为批量创建的任务,for循环同级的下一条语句为执行函数,通过执行函数执行任务;
⑤、将起始值a和上限跟随值g都加上分批尺度h的数值;重复上述判断过程②-④,至完成所有链接的分批创建;
步骤B、将链接存入mongoDB数据库中;
所述步骤B中,链接通过re.sub()函数进行转换,并以dict形式将链接作为key值进行储存;
步骤C、分批创建任务并执行;
所述分批创建的任务为协程任务,所述步骤C中,当链接创建完成一批,协程直接获取该批链接,并实例化异步协程对象,将多个链接放入ensure_future()函数的执行爬虫访问任务中,开始执行协程任务;
步骤D、更新数据库,根据任务执行结果,对数据库中的链接进行更新:
所述步骤D包括:首先通过find()函数查询数据,获取key值;并通过list()将key值进行转换,获取链接;将链接字符串通过re.sub()函数进行恢复,从而完成对链接的更新;
步骤E、全部任务执行完毕,结束;
所述步骤E包括:当一批任务执行完后,判断是否完成全部任务;若否,则重复上述步骤A-D,重新进行创建任务并执行,至全部任务执行完毕。
2.根据权利要求1所述的基于编程语言分批调度任务的方法,其特征在于,所述分批调度任务的方法通过循环嵌套实现,通过对循环嵌套的内层循环设定变量,并将执行函数放置于循环嵌套的外层循环中,使循环嵌套在执行完一层循环进入下一层循环时,自动更新内层循环的上下限,完成链接的分批创建。
CN202010662645.7A 2020-07-10 2020-07-10 一种基于编程语言分批调度任务的方法 Active CN111796922B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010662645.7A CN111796922B (zh) 2020-07-10 2020-07-10 一种基于编程语言分批调度任务的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010662645.7A CN111796922B (zh) 2020-07-10 2020-07-10 一种基于编程语言分批调度任务的方法

Publications (2)

Publication Number Publication Date
CN111796922A CN111796922A (zh) 2020-10-20
CN111796922B true CN111796922B (zh) 2022-02-01

Family

ID=72806760

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010662645.7A Active CN111796922B (zh) 2020-07-10 2020-07-10 一种基于编程语言分批调度任务的方法

Country Status (1)

Country Link
CN (1) CN111796922B (zh)

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7299219B2 (en) * 2001-05-08 2007-11-20 The Johns Hopkins University High refresh-rate retrieval of freshly published content using distributed crawling
US7752207B2 (en) * 2007-05-01 2010-07-06 Oracle International Corporation Crawlable applications
CN101630330A (zh) * 2009-08-14 2010-01-20 苏州锐创通信有限责任公司 一种网页分类方法
CN101908071B (zh) * 2010-08-10 2012-09-05 厦门市美亚柏科信息股份有限公司 一种提高搜索引擎搜索效率的方法及其***
CN102073678B (zh) * 2010-12-03 2013-02-27 厦门市美亚柏科信息股份有限公司 一种网站信息分析***及其方法
CN111078323B (zh) * 2019-10-12 2024-06-28 平安科技(深圳)有限公司 基于协程的数据处理方法、装置、计算机设备及存储介质

Also Published As

Publication number Publication date
CN111796922A (zh) 2020-10-20

Similar Documents

Publication Publication Date Title
CN107239335B (zh) 分布式***的作业调度***及方法
CN105956021B (zh) 一种适用于分布式机器学习的自动化任务并行的方法及其***
CN111738434B (zh) 在异构处理单元上执行深度神经网络的方法
US4951225A (en) Updating pattern-matching networks
CN106681820A (zh) 基于消息组合的可扩展大数据计算方法
CN117271101B (zh) 一种算子融合方法、装置、电子设备及存储介质
CN113157694A (zh) 一种基于强化学习的数据库索引生成方法
CN108415740A (zh) 一种应用于数据分析任务的工作流调度方法
Qu et al. Design and implementation of system generator based on rule engine
CN111796922B (zh) 一种基于编程语言分批调度任务的方法
CN105550028A (zh) 一种基于缓存锁的多任务时序执行方法及***
CN108345505B (zh) 一种多线程资源管理方法和***
CN113051722B (zh) 利用嵌入离散动态事件树改进核电厂安全性能分析的方法
WO2022253165A1 (zh) 调度方法、***、服务器和计算机可读存储介质
CN111459464A (zh) 节点融合方法、代码生成方法、装置
WO2022057459A1 (zh) 一种基于Tensorcore处理int4数据类型的方法、***、设备及介质
JP6758252B2 (ja) ヒストグラム生成方法、ヒストグラム生成装置及びヒストグラム生成プログラム
CN114880079A (zh) 基于强化学习的Kubernetes集群规模调整方法、***及设备
CN114092313A (zh) 一种基于gpu设备的模型推理加速方法及***
CN114168594A (zh) 一种水平分区表的二级索引创建方法、装置、设备及存储介质
CN114490581A (zh) 异构数据库迁移及数据比对方法、装置、设备和存储介质
CN108108472B (zh) 数据处理方法以及服务器
CN110297693A (zh) 一种分布式软件任务分配的方法及其***
CN114860435B (zh) 基于任务选择过程强化学习的大数据作业调度方法
CN110162531A (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