CN116820430B - 异步读写方法、装置、计算机设备及存储介质 - Google Patents
异步读写方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN116820430B CN116820430B CN202311085817.9A CN202311085817A CN116820430B CN 116820430 B CN116820430 B CN 116820430B CN 202311085817 A CN202311085817 A CN 202311085817A CN 116820430 B CN116820430 B CN 116820430B
- Authority
- CN
- China
- Prior art keywords
- write
- task
- read
- event
- target read
- 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
- 238000000034 method Methods 0.000 title claims abstract description 107
- 238000012545 processing Methods 0.000 claims abstract description 70
- 230000006870 function Effects 0.000 claims description 126
- 230000004044 response Effects 0.000 claims description 86
- 230000015654 memory Effects 0.000 claims description 29
- 230000008569 process Effects 0.000 claims description 18
- 239000013589 supplement Substances 0.000 claims description 11
- 238000012986 modification Methods 0.000 claims description 9
- 230000004048 modification Effects 0.000 claims description 9
- 238000012217 deletion Methods 0.000 claims description 7
- 230000037430 deletion Effects 0.000 claims description 7
- 230000000977 initiatory effect Effects 0.000 abstract description 35
- 230000001960 triggered effect Effects 0.000 abstract description 17
- 230000000903 blocking effect Effects 0.000 description 7
- 230000007246 mechanism Effects 0.000 description 6
- 238000012544 monitoring process Methods 0.000 description 6
- 238000000926 separation method Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 5
- 239000003999 initiator Substances 0.000 description 4
- 230000001360 synchronised effect Effects 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 230000001502 supplementing effect Effects 0.000 description 3
- 239000011800 void material Substances 0.000 description 3
- 238000013507 mapping Methods 0.000 description 2
- 239000007787 solid Substances 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据读写技术领域,公开了异步读写方法、装置、计算机设备及存储介质,本发明基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务;将目标读写任务放入目标读写事件中;目标读写任务与目标读写事件一一对应;基于触发数据集,确定目标读写事件的状态;触发数据集中包含处于触发状态的读写事件的触发数据;当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。如此,可以在目标读写事件触发时,直接根据目标读写事件对读写任务请求进行处理,而不需要将目标读写事件中的数据返回给任务发起端再由任务发起端进行处理,从而提高了处理效率,减少资源消耗量。
Description
技术领域
本发明涉及数据读写技术领域,具体涉及异步读写方法、装置、计算机设备及存储介质。
背景技术
异步I/O(Input/Output,输入/输出)是一种支持数据传输完成前允许其他计算的I/O方式,在发起I/O请求后立即返回,等到内核将I/O请求完成后,才以某种形式通知应用。想要实现异步I/O,通常可以采用将文件读写模式设置为非堵塞(non-blocking)模式的方式,或者采用select()接口的方式。然而采用上述两种方式,I/O请求者还需要对I/O的返回进行处理,不管是采用通知还是同步等待的方式来获取I/O的返回,都需要占据一定的资源消耗量,增加请求处理流程,不适合大量并发的场景。
发明内容
有鉴于此,本发明提供了一种异步读写方法、装置、计算机设备及存储介质,以解决大量并发的情况下,任务发起端资源消耗量大,处理效率低的问题。
第一方面,本发明提供了一种异步读写方法,该方法包括:
基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务;
将目标读写任务放入目标读写事件中;目标读写任务与目标读写事件一一对应;
基于触发数据集,确定目标读写事件的状态;触发数据集中包含处于触发状态的读写事件的触发数据;
当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。
如此,可以在目标读写事件触发时,直接根据目标读写事件对读写任务请求进行处理,而不需要将目标读写事件中的数据返回给任务发起端再由任务发起端进行处理,从而提高了处理效率,减少资源消耗量。
在一种可选的实施方式中,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务,包括:
确定读写任务请求中每个任务的任务配置信息;
基于每个任务的任务配置信息,分别建立每个任务对应的目标读写任务。
在一种可选的实施方式中,基于每个任务的任务配置信息,分别建立每个任务对应的目标读写任务,包括:
将任务的任务标识信息,确定为任务对应的目标读写任务的目标标识信息;
将任务的任务回调函数,确定为任务对应的目标读写任务的目标回调函数。
如此,可以将读写任务请求的相关信息同步到目标读写任务中,通过目标读写任务实现对读写任务请求的响应与处理。
在一种可选的实施方式中,将目标读写任务放入目标读写事件中,包括:
确定目标读写任务对应的目标读写事件;
将目标读写任务写入目标读写事件的事件数据中。
如此,可以将目标读写任务作为目标读写事件的事件数据的一部分,在目标读写事件触发,获取到目标读写事件的事件数据时,通过事件数据中包含的目标读写任务对事件数据进行处理,从而完成对读写任务请求的响应与处理。
在一种可选的实施方式中,确定目标读写任务对应的目标读写事件,包括:
将目标读写任务的目标标识信息,作为目标读写事件的事件标识信息;
确定目标读写事件的事件类型信息。
如此,可以通过目标读写任务的目标标识信息和目标读写事件的事件标识信息,将目标读写任务与目标读写事件对应起来。
在一种可选的实施方式中,该方法,还包括:
基于任务控制函数,关联任务实例和目标读写任务,以将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,基于任务控制函数,关联任务实例和目标读写任务,以将目标读写事件添加到任务实例的事件集合中,包括:
将任务控制函数中实例标识设置为任务实例的实例标识信息;
将任务控制函数中任务标识设置为目标读写任务的目标标识信息;
将任务控制函数中操作参数设置为添加事件对应的值;
调用任务控制函数,以关联任务实例和目标读写任务,并将目标读写事件添加到任务实例的事件集合中。
如此,可以通过任务控制函数,将任务实例和目标读写任务关联起来,从而将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,基于触发数据集,确定所述目标读写事件的状态,包括:
获取触发数据集;
当触发数据集中,存在触发数据中事件标识信息与目标读写任务的目标标识信息一致时,确定目标读写事件的状态为触发状态。
如此,可以根据事件标识信息,从触发数据集中确定出是否处于触发状态的读写事件中是否包含目标读写事件。
在一种可选的实施方式中,该方法,还包括:
当目标读写事件的事件数据中写入待处理数据时,将目标读写事件的事件类型信息和事件标识信息,作为目标读写事件的触发数据;
将目标读写事件的触发数据加入触发数据集。
如此,可以在目标读写事件中写入待处理数据时,触发目标读写事件。
在一种可选的实施方式中,将目标读写事件的触发数据加入触发数据集之后,还包括:
将目标读写事件中的事件类型信息清除。
在一种可选的实施方式中,基于目标读写事件,处理目标读写事件对应的读写任务请求,包括:
获取目标读写事件的事件数据;
从事件数据中取出目标读写任务和待处理数据;
基于目标读写任务,对待处理数据进行处理。
如此,可以在目标读写事件触发时,通过事件数据中包含的目标读写任务对待处理数据进行处理,不需要将待处理数据取出并回传给任务发起端,从而提高了处理效率。
在一种可选的实施方式中,基于目标读写任务,对待处理数据进行处理,包括:
获取目标读写任务中的目标回调函数;
调用目标回调函数,对待处理数据进行处理。
如此,可以按照读写任务请求对应的目标回调函数,对待处理数据进行处理,从而按照读写任务请求的需求完成数据处理。
在一种可选的实施方式中,基于目标读写事件,处理读写任务请求之后,还包括:
当读写任务请求的响应次数达到预设响应次数时,解除任务实例和目标读写任务的关联。
在一种可选的实施方式中,解除任务实例和目标读写任务的关联,包括:
将任务控制函数中操作参数设置为删除事件对应的值;
调用任务控制函数,以解除任务实例和目标读写任务的关联,并将目标读写事件从任务实例的事件集合中删除。
在一种可选的实施方式中,基于目标读写事件,处理读写任务请求之后,还包括:
当读写任务请求的响应次数未达到预设响应次数时,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
在一种可选的实施方式中,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息,包括:
确定目标读写事件的事件类型信息;
将任务控制函数中操作参数设置为修改事件对应的值;
调用任务控制函数,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
如此,可以在读写任务请求的响应次数达到需求的预设响应次数时,再解除任务实例和目标读写任务的关联,避免反复在任务实例和目标读写任务之间建立、解除关联关系,从而提高处理效率。
在一种可选的实施方式中,该方法,还包括:
当任务等待函数返回第一预设值时,确定读写任务请求未响应。
在一种可选的实施方式中,该方法,还包括:
当读写任务请求中每个任务对应的目标读写任务均处理完成时,确定读写任务请求响应完成。
如此,可以将读写任务请求拆分成多个任务,对读写任务请求中包含的任务分别进行处理,当读写任务请求中的每个任务都处理完成时确定读写任务请求响应完成,而不再需要读写任务请求一直占据进程等待数据的返回和处理,从而实现读写任务请求的异步响应。
第二方面,本发明提供了一种异步读写装置,该装置包括:
目标读写任务建立模块,用于基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务;
目标读写事件写入模块,用于将目标读写任务放入目标读写事件中;目标读写任务与目标读写事件一一对应;
读写事件状态确定模块,用于基于触发数据集,确定目标读写事件的状态;触发数据集中包含处于触发状态的读写事件的触发数据;
读写任务请求处理模块,用于当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。
第三方面,本发明提供了一种计算机设备,包括:存储器和处理器,存储器和处理器之间互相通信连接,存储器中存储有计算机指令,处理器通过执行计算机指令,从而执行上述第一方面或其对应的任一实施方式的异步读写方法。
第四方面,本发明提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机指令,计算机指令用于使计算机执行上述第一方面或其对应的任一实施方式的异步读写方法。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例的一种异步读写方法的流程示意图;
图2是根据本发明实施例的一种异步读写方法的流程示意图;
图3是根据本发明实施例的一种异步读写方法的流程示意图;
图4是根据本发明实施例的一种异步读写方法的流程示意图;
图5是根据本发明实施例的一种异步读写方法的流程示意图;
图6是根据本发明实施例的一种异步读写方法的流程示意图;
图7是根据本发明实施例的一种异步读写方法的流程示意图;
图8是基于本实例提供的异步读写方法的线程流转示意图;
图9是根据本发明实施例的异步读写装置的结构框图;
图10是本发明实施例的计算机设备的硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在linux***中,I/O(Input/Output,输入/输出)可以分为以下五种模式:阻塞 I/O(blocking I/O)、非阻塞 I/O(non-blocking I/O)、I/O 多路复用(I/O multiplexing)、信号驱动 I/O(signal driven I/O)以及异步 I/O(asynchronous I/O)。其中,阻塞型I/O接口在调用时让当前线程一直阻塞,直到***调用获得结果或者超时出错,在并发量大的时候需要创建大量的线程来维护网络连接,内存和线程的开销非常大;非阻塞型I/O接口,在发起请求后,用户进程需要不断向***主动确认数据是否准备好,因此会占据较多资源。多路复用型I/O接口需要不断轮询其负责的所有socket(套接字),在负责的套接字较多的情况下,需要消耗大量资源和时间轮询这些套接字;信号触发型I/O接口利用信号机制让调用线程不用阻塞,但依然需要等待数据的拷贝,处理效率低。上述四种I/O接口方式都存在资源消耗大或者处理效率低的缺陷,不能适用于大量并发的情况;而异步I/O接口能够支持数据传输完成前允许其他计算的I/O,在发起I/O请求后立即返回,等到内核将I/O请求完成后,才以某种形式通知应用,与其他I/O技术相比,不需要维护数据未读齐时的逻辑处理,能够减少线程数量,从而能够很好地应对大量并发的情况。
然而,相关技术中,实现异步I/O主要有以下两种方法。第一种方法,通过设置文件读写模式为非阻塞模式实现异步I/O,该方法需要不断查询数据,当I/O读写完成后,需要通知请求发起方,请求发起方负责数据的收发处理,处理效率低;第二种方法,通过select()接口实现异步I/O,但每次传入和取回时都要涉及到文件描述符数组在用户态和内核态之间的复制,并且需要将文件描述符数组中的信息全部遍历一遍,也就是需要消耗大量时间和资源进行轮询。并且,这两种方法,I/O请求发起方还需要对I/O的返回进行处理,不管是采用通知还是同步等待的方式来获取I/O的返回,都需要占据一定的资源消耗量,增加请求处理流程,不适合大量并发的场景。
基于此,本发明实施例提供了一种异步读写方法,该方法可以适用于I/O接口中,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务; 将目标读写任务放入目标读写事件中;目标读写任务与目标读写事件一一对应;基于触发数据集,确定目标读写事件的状态;触发数据集中包含处于触发状态的读写事件的触发数据;当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。如此,可以在目标读写事件触发时,直接根据目标读写事件对读写任务请求进行处理,而不需要将目标读写事件中的数据返回给任务发起端,即I/O请求发起方,再由任务发起端进行处理,从而提高了处理效率,减少资源消耗量。
根据本发明实施例,提供了一种异步读写方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机***中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图1是根据本发明实施例的一种异步读写方法的流程图,如图1所示,该流程包括如下步骤:
步骤S101,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。
本发明实施例中,当产生业务需求时,任务发起端生成业务需求对应的读写任务请求,以通过I/O来获取业务需求相关的数据并进行相关处理,实现对业务的响应。此时,相应的建立目标读写任务,以将读写任务请求映射到目标读写任务中,通过目标读写任务来完成对读写任务请求的响应,由此实现对业务的响应。
本发明实施例中,一个读写任务请求中可以包括多个任务,将读写任务请求拆分成多个任务,然后分别建立这些任务对应的目标读写任务,以通过目标读写任务完成对其对应的任务的响应。当读写任务请求中包含的每个任务都完成响应时,就可以确定读写任务请求响应完成;并且由于将读写任务请求拆分成多个任务进行响应,读写任务请求在发起后就不需要再继续占据进程以等待处理数据的返回,从而实现读写任务请求的异步。
步骤S102,将目标读写任务放入目标读写事件中。
本发明实施例中,目标读写事件是目标读写任务对应的读写事件,目标读写任务与目标读写事件一一对应,每个读写任务,或者说每个读写任务请求中包含的每个任务,分别对应于一个读写事件,读写事件中会写入其对应的读写任务请求的相关数据。也就是说,任务读写请求相关的待处理数据会写入目标读写事件中,同时目标读写任务也写入到目标读写事件中存放待处理数据的存储空间中。当待处理数据写入目标读写事件中时,就可以从目标读写事件对应的存储空间中同时获取到待处理数据和目标读写任务。
步骤S103,基于触发数据集,确定目标读写事件的状态。
本发明实施例中,触发数据集中包含处于触发状态的读写事件的触发数据,触发数据集用于从多个待响应处理的读写事件中确定出处于触发状态的读写事件,从而对这些处于触发状态的读写事件进行响应。
本发明实施例中,目标读写事件的状态包括触发状态和待触发状态。当目标读写事件的状态为触发状态时,目标读写事件中已写入待处理数据;当目标读写事件的状态为待触发状态时,目标读写事件中还没有写入待处理数据。
步骤S104,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。
本发明实施例中,当待处理数据写入目标读写事件中时,就会触发目标读写事件,也就是使目标读写事件的状态切换到触发状态,该触发状态表明目标读写事件中的数据已经准备好,可以完成对读写任务请求的响应,此时基于目标读写事件,获取其中的待处理数据和目标读写任务,通过目标读写任务对待处理数据进行处理,从而完成对目标读写任务的响应。
在一种可选的实施方式中,该方法还包括:当读写任务请求中每个任务对应的目标读写任务均处理完成时,确定读写任务请求响应完成。也就是说,将读写任务请求拆分成多个任务,对读写任务请求中包含的任务分别进行处理,当读写任务请求中的每个任务都处理完成时确定读写任务请求响应完成,而不再需要读写任务请求一直占据进程等待数据的返回和处理,从而实现读写任务请求的异步响应。
相关技术中,即使采用了异步I/O的方式进行数据读写,但通常使用I/O来获取数据到任务发起端,任务发起端再对数据进行相应的处理以完成对业务需求的响应,在任务发起端发起读写任务请求后,任务发起端依然需要等待数据返回,然后根据返回的数据再做相关处理,由此才能完成读写任务请求的响应。可见,相关技术中的异步I/O读写,并不能做到完全的异步,即不能将读写任务请求的发起与响应完全分离开,在读写任务请求的响应过程中,需要占用一定的资源去等待或者获取数据的返回,因此也就不适用于大量并发的场景,在大量并发的场景下会增加资源消耗,降低处理效率。
而本发明实施例中,则将任务读写请求映射到其包含的任务对应的目标读写任务中,通过目标读写任务来完成对读写任务请求的响应,并且将目标读写任务写入到其对应的目标读写事件中,当目标读写事件触发时,就可以同步获取到待处理数据和目标读写任务,此时就可以通过目标读写任务对待处理数据进行处理,而不需要将待处理数据返回任务发起端再由任务发起端进行处理。也就是说,对于任务发起端而言,只需要发起任务读写请求,任务响应端将目标读写任务写入目标读写事件后,任务发起端的业务就算处理完成,不需要再占据线程;具体的数据处理和结果返回则由任务响应端执行,任务发起端不需要等待读取的数据再返回,由此实现真正的异步,即读写任务请求的发起与响应完成完全分离,从而在大量并发的情况下减少资源消耗,提高处理效率。
本发明实例提供的异步读写方法,通过在目标读写事件触发时,直接根据目标读写事件对读写任务请求进行处理,而不需要将目标读写事件中的数据返回给任务发起端再由任务发起端进行处理,从而提高了处理效率,减少资源消耗量,能够适用于大量并发的场景。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图2是根据本发明实施例的一种异步读写方法的流程图,如图2所示,该流程包括如下步骤:
步骤S201,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。
具体的,步骤S201,包括:
步骤S2011,确定读写任务请求中每个任务的任务配置信息。
本发明实施例中,任务配置信息指明了该任务对应的相关文件以及该任务对应的相关数据处理方法。也就是说,任务配置信息可以包括任务标识信息和任务回调函数。
本发明实施例中,任务标识信息指示该任务对应的文件,具体的,可以是该文件的文件描述符(file descriptor,fd)。由于linux下一切皆文件,不仅普通文件、目录等信息是文件,其他内容,例如进程、磁盘、设备,设置套接字等,均被抽象成文件,以文件的形式进行操作。而文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指代被打开的文件,那么就可以通过文件描述符(fd),来确定每个操作针对或者调用的具体文件。
本发明实施例中,任务回调函数是该任务针对其对应的文件做出的具体操作,其可以以回调函数的形式,调用文件中的相关数据,来完成任务需求的相关操作。
举例而言,当产生读取密钥的业务需求时,则打开密钥文件,得到密钥文件的文件描述符secret_key_fd,定义密钥文件读取后回调函数为secret_key_callback(),那么该业务需求的读写任务请求对应的任务标识信息即为密钥文件的文件描述符secret_key_fd,任务回调函数即为secret_key_callback()。
步骤S2012,基于每个任务的任务配置信息,分别建立每个任务对应的目标读写任务。
本发明实施例中,任务配置信息包括任务标识信息和任务回调函数,那么相应的,基于每个任务的任务配置信息,分别建立每个任务对应的目标读写任务,也就包括:将任务的任务标识信息,确定为任务对应的目标读写任务的目标标识信息;以及,将任务的任务回调函数,确定为任务对应的目标读写任务的目标回调函数。也就是说,将表征读写任务请求的相关信息和操作方式,同步到各个目标读写任务,将读写任务请求映射到目标读写任务中,由此通过目标读写任务实现对读写任务请求的响应与处理,通过目标读写任务实现读写任务请求的发起和响应的分离解耦。
在一种可选的实施方式中,通过设计自定义的数据结构io_task,来建立目标读写任务。具体的,可以通过如下形式来定义目标读写任务对应的数据结构体io_task:
typedef struct
{
void (*notify)(void *);
int fd;
unsigned int flags;
}io_task;
其中,io_task为目标读写任务,typedef为类型定义,struct为结构体类型,那么typedef struct则为结构体定义,表明io_task的类型为结构体,typedef struct和io_task之间的内容则为该数据结构体io_task的结构构成。具体的,目标读写任务对应的数据结构体io_task包括回调函数的函数指针*notify,文件描述符fd和事件标识flags。其中,文件描述符fd即为目标标识信息;回调函数的函数指针*notify即为目标回调函数。
在一种可选的实施方式中,事件标识flags是对数据结构体io_task对应的文件,也就是目标标识信息fd对应的文件的类型限定,具体限定了在打开或者调用对应文件时的相关操作方式或者机制,其可以是EFD_CLOEXEC、EFD_NONBLOCK以及EFD_SEMAPHORE这三者中其中任意一个或者组合。其中,EFD_CLOEXEC为执行时关闭标志,即在打开对应的文件、进程进行相关调用后就关闭该文件;EFD_NONBLOCK,表明任何打开对应文件并返回文件描述符,也就是目标标识信息的***调用都不会阻塞进程,即如果无法获取目标标识信息就立即返回;EFD_SEMAPHORE,能够提供一种类似于信号量(semophore)的机制,其相当于从目标标识信息读取内容时的机制保护,举例而言,在semophore语义下进行读操作,每读一次数据则将counter值,也就是计数值减1。
举例而言,当产生读取密钥的业务需求时,则打开密钥文件,得到密钥文件的文件描述符secret_key_fd,定义密钥文件读取后回调函数为secret_key_callback(),那么该业务需求的读写任务请求对应的任务标识信息即为密钥文件的文件描述符secret_key_fd,任务回调函数即为secret_key_callback()。那么,可以定义读取密钥的业务需求对应的数据结构体为secret_key_io_task,相应的,将secret_key_io_task.fd赋值为 secret_key_fd,secret_key_io_task. notify 赋值为 secret_key_callback,并根据设置需求赋值secret_key_io_task.flags,由此创建得到目标读写任务的数据结构体。其中,secret_key_io_task.fd表明该文件描述符fd来自于secret_key_io_task,secret_key_io_task.notify表明该回调函数的函数指针notify来自于secret_key_io_task,secret_key_io_task.flags表明该事件标识flags来自于secret_key_io_task。
步骤S202,将目标读写任务放入目标读写事件中。详细请参见图1所示实施例的步骤S102,在此不再赘述。
步骤S203,基于触发数据集,确定目标读写事件的状态。详细请参见图1所示实施例的步骤S103,在此不再赘述。
步骤S204,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。详细请参见图1所示实施例的步骤S104,在此不再赘述。
本发明实施例提供的异步读写方法,通过将读写任务请求映射到目标读写任务中,通过目标读写任务实现对读写任务请求的响应与处理,从而实现读写任务请求的发起和响应的分离解耦。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图3是根据本发明实施例的一种异步读写方法的流程图,如图3所示,该流程包括如下步骤:
步骤S301,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。详细请参见图1所示实施例的步骤S101,在此不再赘述。
步骤S302,将目标读写任务放入目标读写事件中。
具体的,步骤S302包括:
步骤S3021,确定目标读写任务对应的目标读写事件。
本发明实施例中,目标读写事件中可以包括三个部分,分别为事件标识信息、事件类型信息和事件数据。其中,事件标识信息与该目标读写事件对应的目标读写任务的目标标识信息一致,从而通过事件标识信息将目标读写事件与目标读写任务对应起来;事件类型信息为该目标读写事件的事件类型,表明该目标读写事件的操作类型或者触发类型;事件数据用于存放待处理数据。
在一种可选的实施方式中,步骤S3021,可以包括:
步骤a1,将目标读写任务的目标标识信息,作为目标读写事件的事件标识信息。
本发明实施例中,将目标读写任务的目标标识信息作为目标读写事件的事件标识信息,以在目标读写任务和目标读写事件之间建立对应关系,从而通过目标标识信息就能够确定出目标读写任务对应的目标读写事件,通过事件标识信息就能够确定出目标读写事件对应的目标读写任务。
步骤a2,确定目标读写事件的事件类型信息。
本发明实施例中,事件类型信息可以有如下几种类型的内容,可以根据读写任务请求的具体需要进行设置:
1.EPOLLIN:表示被监听的文件有可以读的数据;
2.EPOLLOUT:表示被监听的文件有可以写的数据;
3.EPOLLPRI:表示被监听的文件有可读的高优先级数据;
4.EPOLLERR:表示对应的文件发生异常;
5.EPOLLHUP:表示对应的文件被挂起;
6.EPOLLET:表示使用边沿触发;
7.EPOLLONESHOT:表示在一次事件产生被处理之后,文件不再被监听。
如此,可以通过目标读写任务的目标标识信息和目标读写事件的事件标识信息,将目标读写任务与目标读写事件对应起来。
在一种可选的实施方式中,由于任务响应端基于任务实例进行数据查询和调用,因此为了使任务响应端能够实时确认目标读写事件中的数据更新状态,还需要将目标读写任务与任务实例关联起来,从而将目标读写事件添加到任务实例的事件集合中。具体的,该方法还包括:基于任务控制函数,关联任务实例和目标读写任务,以将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,基于任务控制函数,关联任务实例和目标读写任务,以将目标读写事件添加到任务实例的事件集合中,包括:将任务控制函数中实例标识设置为任务实例的实例标识信息;将任务控制函数中任务标识设置为目标读写任务的目标标识信息;将任务控制函数中操作参数设置为添加事件对应的值;调用任务控制函数,以关联任务实例和目标读写任务,并将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,可以通过epoll接口来实现目标读写任务与任务实例之间的关联。epoll接口是为解决linux内核处理大量文件描述符而提出的方案,epoll接口是对linux下多路复用型I/O接口中select接口和poll接口的增强。epoll接口在高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况下,能显著提高处理器的利用率。
在一种可选的实施方式中,任务控制函数可以是epoll接口的事件注册函数epoll_ctl()函数,epoll_ctl()函数成功调用将关联任务实例和目标读写任务,其能够控制并修改任务实例中每个读写任务上的事件。epoll_ctl()函数的具体构成如下:intepoll_ctl (int epfd, int op, int fd, struct epoll_event *event)。其中,epfd为实例标识,是epoll专用的文件描述符,该文件描述符实际上和真正的文件没有关系,仅用于后续epoll机制下的相关调用;op为操作参数,是对文件描述符fd对应的文件的具体操作;fd为任务标识,也就是文件描述符,对应于目标标识信息;epoll_event是关于目标读写事件的结构体,*event则是指向具体某一目标读写事件的指针。通过对epoll_ctl()函数中各项参数进行赋值,将实例标识赋值为任务实例的实例标识信息,将操作参数赋值为添加事件对应的值,将任务标识赋值为目标读写任务的目标标识信息,即目标读写任务对应的文件描述符,由此,通过任务控制函数,将任务实例和目标读写任务关联起来,从而将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,将操作参数op设置为不同的值,就能够通过任务控制函数,调整任务实例的事件集合中包含的读写事件,以及其中读写事件的相关信息。操作参数op可以包括添加事件、修改事件以及删除事件分别对应的值,具体的,可以如下所示:
EPOLL_CTL_ADD:添加事件。将文件描述符fd对应的文件添加到实例标识epfd对应的epoll实例监听集中,监听epoll_event结构体定义的事件;也就是将目标读写任务与任务实例关联,将目标读写任务对应的文件添加到任务实例的监听集中,将目标读写事件添加到任务实例的事件集合中。
EPOLL_CTL_DEL:删除事件。将文件描述符fd对应的文件从实例标识epfd对应的epoll实例监听集中删除;也就是取消目标读写任务与任务实例的关联,将目标读写任务对应的文件从任务实例的监听集中移除,将目标读写事件从任务实例的事件集合中移除。
EPOLL_CTL_MOD:修改事件。修改任务实例的事件集合中目标读写事件的信息,改变对目标读写任务对应的文件的监听行为。
在一种可选的实施方式中,可以通过epoll接口的创建函数epoll_create()函数,创建任务实例,并得到该任务实例的文件描述符,也就是实例标识epfd。具体的,epoll_create()函数的构成如下:int epoll_create(int size)。其中,size是在该任务实例上能够监听的文件的最大数量,也就是该任务实例能够关联的目标读写任务的最大数量。当对epoll_create()函数的调用成功时,epoll_create()函数将创建一个epoll任务实例,并返回实例标识epfd;当对epoll_create()函数的调用失败出错时,epoll_create()函数返回-1,并根据出错原因设置错误码errno。具体的,错误码可以包括:EINVAL,表示size不是正数;ENFILE,表示***打开的文件数量已经达到上限;ENOMEN,表示没有足够内存完成该次操作。
步骤S3022,将目标读写任务写入目标读写事件的事件数据中。
本发明实施例中,如前所述,目标读写事件中可以包括三个部分,分别为事件标识信息、事件类型信息和事件数据,其中,事件标识信息与该目标读写事件对应的目标读写任务的目标标识信息一致,从而通过事件标识信息将目标读写事件与目标读写任务对应起来;事件类型信息为该目标读写事件的事件类型,表明该目标读写事件的操作类型或者触发类型;事件数据用于存放待处理数据。
在一种可选的实施方式中,在epoll***中,目标读写事件可以是epoll_event结构体的形式。具体的,epoll_event结构体中包含的信息如下所示:
struct epoll_event {
_u32 events;
epoll_data_t data;
};
其中,events字段为事件类型信息,其取值如上步骤S3021中所述;data字段表示用户数据,其类型为union,即联合体类型,可以存放一个指针或者文件描述符等数据,其定义具体如下:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
其中,ptr可以指向任何类型的用户数据,对应于事件数据;fd表示文件描述符,对应于事件标识信息;u32和u64分别表示一个32位和64位的无符号整数。在实际使用时,用户可以将自己需要的数据,也就是待处理数据存放到这个字段中,具体存放到data字段的ptr中,即将ptr指向待处理数据;当目标读写事件触发时,***就会调用并返回ptr指向的待处理数据,以对目标读写事件进行处理。
由上可知,在epoll***中,目标读写事件的事件数据存放在epoll_event.data.ptr中,也就是epoll_event结构体中data字段中的ptr中。那么,将目标读写任务写入目标读写事件的事件数据中,也就是将io_task赋值给epoll_event.data.ptr,使目标读写任务io_task作为目标读写事件epoll_event的事件数据epoll_event.data.ptr的一部分。由此,在目标读写事件epoll_event触发,获取到目标读写事件epoll_event的事件数据epoll_event.data.ptr时,不仅能够得到事件数据epoll_event.data.ptr中存放的待处理数据,还能够得到目标读写任务io_task,而目标读写任务io_task又是读写任务请求的映射,其反映了读写任务请求对目标读写事件中待处理数据的处理要求和操作,那么就能够根据目标读写任务io_task对待处理数据进行处理,从而完成对读写任务请求的响应与处理,由此在读写任务请求的发起和响应的分离解耦后,依然能够及时完成对读写任务请求的响应。
步骤S303,基于触发数据集,确定目标读写事件的状态。详细请参见图1所示实施例的步骤S103,在此不再赘述。
步骤S304,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。详细请参见图1所示实施例的步骤S104,在此不再赘述。
本发明实施例提供的异步读写方法,一方面基于epoll***进行设计,能够充分利用epoll***的高效并发的性质,提高处理效率,降低资源消耗量。另一方面,通过将目标读写任务写入目标读写事件的事件数据,将目标读写任务作为目标读写事件的事件数据的一部分,在目标读写事件触发,获取到目标读写事件的事件数据时,同时获取到目标读写任务和待处理数据,通过目标读写任务对待处理数据进行处理,从而在读写任务请求的发起和响应的分离解耦后,依然能够及时完成对读写任务请求的响应。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图4是根据本发明实施例的一种异步读写方法的流程图,如图4所示,该流程包括如下步骤:
步骤S401,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。详细请参见图1所示实施例的步骤S101,在此不再赘述。
步骤S402,将目标读写任务放入目标读写事件中。详细请参见图1所示实施例的步骤S102,在此不再赘述。
步骤S403,基于触发数据集,确定目标读写事件的状态。
具体的,步骤S403,包括:
步骤S4031,获取触发数据集。
本发明实施例中,触发数据集用于从任务实例的事件集合中确定出处于触发状态的读写事件。当任务实例的事件集合中有目标读写事件的状态为触发状态时,通过等待函数epoll_wait()函数,将该目标读写事件的相关信息放入触发数据集中,然后返回触发数据集,根据触发数据集,就能够确定哪些目标读写事件中的待处理数据已经更新,并且从中获取到待处理数据。
在一种可选的实施方式中,该方法还包括将待处理数据更新的目标读写事件的状态修改为触发状态,将目标读写事件加入触发数据集的步骤。具体的,将待处理数据更新的目标读写事件的状态修改为触发状态,将目标读写事件加入触发数据集,可以包括:当目标读写事件的事件数据中写入待处理数据时,将目标读写事件的事件类型信息和事件标识信息,作为目标读写事件的触发数据;将目标读写事件的触发数据加入触发数据集。
在一种可选的实施方式中,事件标识信息,也就是文件描述符fd能够唯一确定目标读写事件以及对应的目标读写任务所打开并操作的文件;而对于同一个文件而言,可能会产生不同操作类型的业务需求,即会对应于不同操作类型的目标读写事件和目标读写任务,那么事件类型信息,就能确定出该文件对应的目标读写事件和目标读写任务的操作类型。也就是说,根据事件标识信息和事件类型信息,就能够唯一确定出一个目标读写事件,并且能够确定出该目标读写事件的操作类型。举例而言,任务实例的事件集合中包含有关于密钥文件的读取事件,密钥文件的读取事件的事件标识信息为secret_key_fd,密钥文件的读取事件的事件类型信息为EPOLLIN,那么当触发数据集中有一条事件标识信息为secret_key_fd,事件类型信息为EPOLLIN的触发数据时,就能够确定该触发数据对应的目标读写事件为密钥文件的读取事件。因此需要将事件标识信息和事件类型信息作为目标读写事件的触发数据加入触发数据集,就能够唯一确定出一个目标读写事件对应的文件以及需要进行的操作类型。由此,在目标读写事件中写入待处理数据时,通过构建触发数据并将触发数据写入触发数据集中,触发目标读写事件。
在一种可选的实施方式中,在将目标读写事件的触发数据加入触发数据集之后,还包括将目标读写事件中的事件类型信息清除的步骤,以表明该目标读写事件已经被触发,其对应的读写任务请求已经产生响应。
步骤S4032,当触发数据集中,存在触发数据中事件标识信息与目标读写任务的目标标识信息一致时,确定目标读写事件的状态为触发状态。
由上所述,当目标读写事件的事件数据中写入待处理数据时,目标读写事件触发,等待函数epoll_wait()函数将该目标读写事件加入触发数据集,然后返回触发数据集。在返回得到触发数据集后,就能够根据触发数据集确定哪些目标读写事件处于触发状态,在确定目标读写事件的状态为触发状态后,就能够确定目标读写事件的事件数据中已写入待处理数据,此时就能够根据目标读写事件完成对读写任务请求的响应。由此,可以根据事件标识信息,从触发数据集中确定出是否处于触发状态的读写事件中是否包含目标读写事件。
步骤S404,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。详细请参见图1所示实施例的步骤S104,在此不再赘述。
本发明实施例提供的异步读写方法,通过将处于触发状态的读写事件的事件标识信息和事件类型信息构成触发数据,并放入触发数据集,实现对触发数据集进行查找就能够确定出处于触发状态的读写事件,从而完成对读写事件对应的读写任务的处理。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图5是根据本发明实施例的一种异步读写方法的流程图,如图5所示,该流程包括如下步骤:
步骤S501,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。详细请参见图1所示实施例的步骤S101,在此不再赘述。
步骤S502,将目标读写任务放入目标读写事件中。详细请参见图1所示实施例的步骤S102,在此不再赘述。
步骤S503,基于触发数据集,确定目标读写事件的状态。详细请参见图1所示实施例的步骤S103,在此不再赘述。
步骤S504,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。
具体的,步骤S504,包括:
步骤S5041,获取目标读写事件的事件数据。
本发明实施例中,可以通过epoll接口的等待函数epoll_wait()函数来获取目标读写事件的事件数据。通过循环调用等待函数epoll_wait()函数,来确定任务实例中包含的目标读写事件的数据是否更新,当目标读写事件的数据更新时,触发目标读写事件,也就是目标读写事件的状态为触发状态,此时,等待函数epoll_wait()函数返回处于触发状态的目标读写事件的相关数据。等待函数epoll_wait()函数的具体构成如下:
int epoll_wait(int epfd, struct epoll_event *events, int maxevents,int timeout)
其中,epfd为实例标识,是epoll专用的文件描述符;epoll_event是关于目标读写事件的结构体,*event则是指向具体某一目标读写事件的指针;maxevents是触发事件数组包含的最大成员数量,触发事件数组是当前调用中任务实例中处于触发状态的目标读写事件构成的数组,该数组的成员数量也就是当前调用中处于出发状态的目标读写事件的数量;timeout为超时时间,当超过该超时时间依然没有目标读写事件触发时,则等待函数epoll_wait()函数返回0,表示已经超时,特别的,当timeout设置为0时,即使没有目标读写事件触发,调用也立即发生,此时等待函数epoll_wait()函数调用返回0,当timeout设置为-1时,则调用一直等待到有事件发生。
步骤S5042,从事件数据中取出目标读写任务和待处理数据。
本发明实施例中,从事件数据中取出目标读写任务和待处理数据,也就是从epoll_event.data.ptr中取出io_task和待处理数据。
步骤S5043,基于目标读写任务,对待处理数据进行处理。
本发明实施例中,由于目标读写任务是对读写任务请求的映射,基于目标读写任务,就能够对待处理数据进行处理,完成对读写任务请求的响应。
在一种可选的实施方式中,步骤S5043,可以包括:
步骤b1,获取目标读写任务中的目标回调函数。
步骤b2,调用目标回调函数,对待处理数据进行处理。
本发明实施例中,目标读写任务io_task中包含了目标回调函数*notify,目标回调函数*notify就是对读写任务请求的任务回调函数的映射,基于目标回调函数*notify对待处理数据进行处理,就能够完成对读写任务请求的响应。由此,按照读写任务请求对应的目标回调函数,对待处理数据进行处理,从而按照目标读写任务对应的任务需求完成数据处理。
在一种可选的实施方式中,当任务等待函数返回第一预设值,也就是-1时,确定在超时时间内,目标读写事件中都没有数据写入,读写任务请求未响应。
本发明实施例提供的异步读写方法,可以在目标读写事件触发时,通过事件数据中包含的目标读写任务对待处理数据进行处理,不需要将待处理数据取出并回传给任务发起端,从而实现了实现读写任务请求的发起和响应的分离解耦,提高了处理效率。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图6是根据本发明实施例的一种异步读写方法的流程图,如图6所示,该流程包括如下步骤:
步骤S601,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。详细请参见图1所示实施例的步骤S101,在此不再赘述。
步骤S602,将目标读写任务放入目标读写事件中。详细请参见图1所示实施例的步骤S102,在此不再赘述。
步骤S603,基于触发数据集,确定目标读写事件的状态。详细请参见图1所示实施例的步骤S103,在此不再赘述。
步骤S604,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。详细请参见图1所示实施例的步骤S104,在此不再赘述。
步骤S605,当读写任务请求的响应次数达到预设响应次数时,解除任务实例和目标读写任务的关联。
本发明实施例中,对于有多次响应需求或者非临时性响应的读写任务请求,可以设置预设响应次数,该预设响应次数可以根据***中该读写任务请求的发生频率来进行设置。在预设响应次数内,每次完成读写任务请求的响应后,任务实例和目标读写任务的关联不会解除;当读写任务请求的响应次数达到预设响应次数时,解除任务实例和目标读写任务的关联。
在一种可选的实施方式中,可以将临时性响应,或者响应发生频率低于一定频率的读写任务请求,对应的预设响应次数设置为1,在其响应完成后,就直接接触任务实例和其对应的目标读写任务的关联,避免占据任务实例中的资源。
在一种可选的实施方式中,可以在***内预先设置相关读写任务请求的预设响应次数,对于没有预先设置预设响应次数的读写任务请求,则统一默认其预设响应次数为1,即在完成一次响应后就解除任务实例和目标读写任务的关联。
具体的,步骤S605,包括:
步骤S6051,将任务控制函数中操作参数设置为删除事件对应的值。
本发明实施例中,如上述步骤S3021中所述,将任务控制函数epoll_ctl()函数中,操作参数op设置为删除事件对应的值EPOLL_CTL_DEL。
步骤S6052,调用任务控制函数,以解除任务实例和目标读写任务的关联,并将目标读写事件从任务实例的事件集合中删除。
本发明实施例中,将操作参数op设置为删除事件对应的值EPOLL_CTL_DEL,将文件描述符fd设置为目标读写任务的目标标识信息,然后调用任务控制函数epoll_ctl()函数,解除任务实例和目标读写任务的关联,并将目标读写事件从任务实例的事件集合中删除。
在本实施例中提供了一种异步读写方法,可用于上述的I/O接口,图7是根据本发明实施例的一种异步读写方法的流程图,如图7所示,该流程包括如下步骤:
步骤S701,基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务。详细请参见图1所示实施例的步骤S101,在此不再赘述。
步骤S702,将目标读写任务放入目标读写事件中。详细请参见图1所示实施例的步骤S102,在此不再赘述。
步骤S703,基于触发数据集,确定目标读写事件的状态。详细请参见图1所示实施例的步骤S103,在此不再赘述。
步骤S704,当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。详细请参见图1所示实施例的步骤S104,在此不再赘述。
步骤S705,当读写任务请求的响应次数未达到预设响应次数时,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
本发明实施例中,对于有多次响应需求或者非临时性响应的读写任务请求,可以设置预设响应次数,该预设响应次数可以根据***中该读写任务请求的发生频率来进行设置。在预设响应次数内,每次完成读写任务请求的响应后,任务实例和目标读写任务的关联不会解除。并且,由于在将目标读写事件的触发数据加入触发数据集时,将目标读写事件的事件类型信息进行了清除,需要重新对目标读写事件中的事件类型信息进行补充,以保证能够正常调用目标读写事件。
具体的,步骤S705,包括:
步骤S7051,确定目标读写事件的事件类型信息。
本发明实施例中,根据任务读写请求的需求重新确定目标读写事件的事件类型信息,每次设置的事件类型信息可以不同,以适用不同的需求。
步骤S7052,将任务控制函数中操作参数设置为修改事件对应的值。
本发明实施例中,如上述步骤S3021中所述,将任务控制函数epoll_ctl()函数中,操作参数op设置为修改事件对应的值EPOLL_CTL_MOD。
步骤S7053,调用任务控制函数,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
本发明实施例中,将操作参数op设置为修改事件对应的值EPOLL_CTL_MOD,将文件描述符fd设置为目标读写任务的目标标识信息,然后调用任务控制函数epoll_ctl()函数,对目标读写事件进行修改,以补充目标读写中的事件类型信息。
本发明实施例提供的异步读写方法,通过预先设置预设响应次数,在读写任务请求的响应次数达到需求的预设响应次数时,再解除任务实例和目标读写任务的关联,避免反复在任务实例和目标读写任务之间建立、解除关联关系,从而提高处理效率。
图8是基于本实例提供的异步读写方法的线程流转示意图,以下结合图8对本方法中读写任务请求的发起与响应的分离解耦作进一步说明。如图8所示,business_thread为业务发起线程,用于发起读写任务请求,epoll_thread为业务响应线程,用于基于epoll机制对读写任务请求进行响应处理。业务发起线程business_thread在初始化并创建完成目标读写任务io_task后,在目标读写任务io_task和目标读写事件epoll_event之间建立关联,即将目标读写任务io_task写入目标读写事件epoll_event中的事件数据中,并通过调用任务控制函数epoll_ctl()函数,在目标读写任务io_task和任务实例之间建立关联,至此业务发起线程epoll_thread处理完成;业务响应线程epoll_thread循环调用epoll_wait()函数,当目标读写事件epoll_event触发时,获取目标读写事件epoll_event的事件数据,并从中取出目标读写任务io_task和待处理数据,调用目标读写任务io_task中的目标回调函数notify对待处理数据进行处理,至此业务响应线程epoll_thread处理完成。业务发起线程business_thread与业务响应线程epoll_thread之间完全独立,将读写任务请求的发起和响应分离解耦开,从而实现了对读写任务请求的异步响应。
在本实施例中还提供了一种异步读写装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”、“单元”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
本实施例提供一种异步读写装置,如图9所示,包括:
目标读写任务建立模块901,用于基于读写任务请求中包含的任务,分别建立任务对应的目标读写任务;
目标读写事件写入模块902,用于将目标读写任务放入目标读写事件中;目标读写任务与目标读写事件一一对应;
读写事件状态确定模块903,用于基于触发数据集,确定目标读写事件的状态;触发数据集中包含处于触发状态的读写事件的触发数据;
读写任务请求处理模块904,用于当目标读写事件的状态为触发状态时,基于目标读写事件,处理目标读写事件对应的目标读写任务。
在一种可选的实施方式中,目标读写任务建立模块901,包括:
任务配置信息确定单元,用于确定读写任务请求的任务配置信息;
目标读写任务建立单元,用于基于任务配置信息,建立目标读写任务。
在一种可选的实施方式中,任务配置信息确定单元,包括:
目标标识信息确定子单元,用于将任务的任务标识信息,确定为任务对应的目标读写任务的目标标识信息;
目标回调函数确定子单元,用于将任务的任务回调函数,确定为任务对应的目标读写任务的目标回调函数。
在一种可选的实施方式中,目标读写事件写入模块902,包括:
目标读写事件确定单元,用于确定目标读写任务对应的目标读写事件;
目标读写任务写入单元,用于将目标读写任务写入目标读写事件的事件数据中。
在一种可选的实施方式中,目标读写事件确定单元,包括:
事件标识信息确定子单元,用于将目标读写任务的目标标识信息,作为目标读写事件的事件标识信息;
事件类型信息确定子单元,用于确定目标读写事件的事件类型信息。
在一种可选的实施方式中,该装置,还包括:
任务实例关联装置,用于基于任务控制函数,关联任务实例和目标读写任务,以将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,任务实例关联装置,包括:
实例标识确定单元,用于将任务控制函数中实例标识设置为任务实例的实例标识信息;
任务标识确定单元,用于将任务控制函数中任务标识设置为目标读写任务的目标标识信息;
操作参数确定单元,用于将任务控制函数中操作参数设置为添加事件对应的值;
任务控制函数调用单元,用于调用任务控制函数,以关联任务实例和目标读写任务,并将目标读写事件添加到任务实例的事件集合中。
在一种可选的实施方式中,读写事件状态确定模块903,包括:
触发数据集获取单元,用于获取触发数据集;
触发状态确定单元,用于当触发数据集中,存在触发数据中事件标识信息与目标读写任务的目标标识信息一致时,确定目标读写事件的状态为触发状态。
在一种可选的实施方式中,该装置,还包括:
触发数据确定模块,用于当目标读写事件的事件数据中写入待处理数据时,将目标读写事件的事件类型信息和事件标识信息,作为目标读写事件的触发数据;
触发数据集确定模块,用于将目标读写事件的触发数据加入触发数据集。
在一种可选的实施方式中,该装置,还包括:
事件类型信息清除模块,用于将目标读写事件中的事件类型信息清除。
在一种可选的实施方式中,读写任务请求处理模块904,包括:
事件数据获取单元,用于获取目标读写事件的事件数据;
事件数据分离单元,用于从事件数据中取出目标读写任务和待处理数据;
待处理数据处理单元,用于基于目标读写任务,对待处理数据进行处理。
在一种可选的实施方式中,待处理数据处理单元,包括:
目标回调函数获取子单元,用于获取目标读写任务中的目标回调函数;
待处理数据处理子单元,用于调用目标回调函数,对待处理数据进行处理。
在一种可选的实施方式中,该装置,还包括:
关联解除模块,用于当读写任务请求的响应次数达到预设响应次数时,解除任务实例和目标读写任务的关联。
在一种可选的实施方式中,关联解除模块,包括:
操作参数设置单元,用于将任务控制函数中操作参数设置为删除事件对应的值;
关联解除单元,用于调用任务控制函数,以解除任务实例和目标读写任务的关联,并将目标读写事件从任务实例的事件集合中删除。
在一种可选的实施方式中,该装置,还包括:
事件类型信息补充模块,用于当读写任务请求的响应次数未达到预设响应次数时,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
在一种可选的实施方式中,事件类型信息补充模块,包括:
事件类型信息确定单元,用于确定目标读写事件的事件类型信息;
操作参数设置单元,用于将任务控制函数中操作参数设置为修改事件对应的值;
事件类型信息补充单元,用于调用任务控制函数,对目标读写事件进行修改,以补充目标读写事件中的事件类型信息。
在一种可选的实施方式中,该装置,还包括:
任务请求未响应模块,用于当任务等待函数返回第一预设值时,确定读写任务请求未响应。
在一种可选的实施方式中,该装置,还包括:
任务请求响应模块,用于当读写任务请求中每个任务对应的目标读写任务均处理完成时,确定读写任务请求响应完成。
上述各个模块和单元的更进一步的功能描述与上述对应实施例相同,在此不再赘述。
本实施例中的异步读写装置是以功能单元的形式来呈现,这里的单元是指ASIC(Application Specific Integrated Circuit,专用集成电路),执行一个或多个软件或固定程序的处理器和存储器,和/或其他可以提供上述功能的器件。
本发明实施例还提供一种计算机设备,具有上述图9所示的异步读写装置。
请参阅图10,图10是本发明可选实施例提供的一种计算机设备的结构示意图,如图10所示,该计算机设备包括:一个或多个处理器10、存储器20,以及用于连接各部件的接口,包括高速接口和低速接口。各个部件利用不同的总线互相通信连接,并且可以被安装在公共主板上或者根据需要以其它方式安装。处理器可以对在计算机设备内执行的指令进行处理,包括存储在存储器中或者存储器上以在外部输入/输出装置(诸如,耦合至接口的显示设备)上显示GUI的图形信息的指令。在一些可选的实施方式中,若需要,可以将多个处理器和/或多条总线与多个存储器和多个存储器一起使用。同样,可以连接多个计算机设备,各个设备提供部分必要的操作(例如,作为服务器阵列、一组刀片式服务器、或者多处理器***)。图10中以一个处理器10为例。
处理器10可以是中央处理器,网络处理器或其组合。其中,处理器10还可以进一步包括硬件芯片。上述硬件芯片可以是专用集成电路,可编程逻辑器件或其组合。上述可编程逻辑器件可以是复杂可编程逻辑器件,现场可编程逻辑门阵列,通用阵列逻辑或其任意组合。
其中,所述存储器20存储有可由至少一个处理器10执行的指令,以使所述至少一个处理器10执行实现上述实施例示出的方法。
存储器20可以包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需要的应用程序;存储数据区可存储根据计算机设备的使用所创建的数据等。此外,存储器20可以包括高速随机存取存储器,还可以包括非瞬时存储器,例如至少一个磁盘存储器件、闪存器件、或其他非瞬时固态存储器件。在一些可选的实施方式中,存储器20可选包括相对于处理器10远程设置的存储器,这些远程存储器可以通过网络连接至该计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
存储器20可以包括易失性存储器,例如,随机存取存储器;存储器也可以包括非易失性存储器,例如,快闪存储器,硬盘或固态硬盘;存储器20还可以包括上述种类的存储器的组合。
该计算机设备还包括通信接口30,用于该计算机设备与其他设备或通信网络通信。
本发明实施例还提供了一种计算机可读存储介质,上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可记录在存储介质,或者被实现通过网络下载的原始存储在远程存储介质或非暂时机器可读存储介质中并将被存储在本地存储介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件的存储介质上的这样的软件处理。其中,存储介质可为磁碟、光盘、只读存储记忆体、随机存储记忆体、快闪存储器、硬盘或固态硬盘等;进一步地,存储介质还可以包括上述种类的存储器的组合。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件,当软件或计算机代码被计算机、处理器或硬件访问且执行时,实现上述实施例示出的方法。
虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。
Claims (19)
1.一种异步读写方法,其特征在于,所述方法包括:
基于读写任务请求中包含的任务,分别建立所述任务对应的目标读写任务;所述基于读写任务请求中包含的任务,分别建立所述任务对应的目标读写任务,包括:确定所述读写任务请求中每个所述任务的任务配置信息;基于每个所述任务的所述任务配置信息,分别建立每个所述任务对应的所述目标读写任务;
将所述目标读写任务放入目标读写事件中;所述目标读写任务与所述目标读写事件一一对应;所述将所述目标读写任务放入目标读写事件中,包括:确定所述目标读写任务对应的所述目标读写事件;将所述目标读写任务写入所述目标读写事件的事件数据中;
基于触发数据集,确定所述目标读写事件的状态;所述触发数据集中包含处于触发状态的读写事件的触发数据;
当所述目标读写事件的状态为触发状态时,基于所述目标读写事件,处理所述目标读写事件对应的所述目标读写任务。
2.根据权利要求1所述的方法,其特征在于,基于每个所述任务的所述任务配置信息,分别建立每个所述任务对应的所述目标读写任务,包括:
将所述任务的任务标识信息,确定为所述任务对应的所述目标读写任务的目标标识信息;
将所述任务的任务回调函数,确定为所述任务对应的所述目标读写任务的目标回调函数。
3.根据权利要求1所述的方法,其特征在于,所述确定所述目标读写任务对应的所述目标读写事件,包括:
将所述目标读写任务的目标标识信息,作为所述目标读写事件的事件标识信息;
确定所述目标读写事件的事件类型信息。
4.根据权利要求1所述的方法,其特征在于,所述方法,还包括:
基于任务控制函数,关联任务实例和所述目标读写任务,以将所述目标读写事件添加到所述任务实例的事件集合中。
5.根据权利要求4所述的方法,其特征在于,所述基于任务控制函数,关联任务实例和所述目标读写任务,以将所述目标读写事件添加到所述任务实例的事件集合中,包括:
将所述任务控制函数中实例标识设置为所述任务实例的实例标识信息;
将所述任务控制函数中任务标识设置为所述目标读写任务的目标标识信息;
将所述任务控制函数中操作参数设置为添加事件对应的值;
调用所述任务控制函数,以关联所述任务实例和所述目标读写任务,并将所述目标读写事件添加到所述任务实例的事件集合中。
6.根据权利要求1所述的方法,其特征在于,所述基于触发数据集,确定所述目标读写事件的状态,包括:
获取所述触发数据集;
当所述触发数据集中,存在所述触发数据中的事件标识信息与所述目标读写任务的目标标识信息一致时,确定所述目标读写事件的状态为所述触发状态。
7.根据权利要求1所述的方法,其特征在于,所述方法,还包括:
当所述目标读写事件的事件数据中写入待处理数据时,将所述目标读写事件的事件类型信息和事件标识信息,作为所述目标读写事件的所述触发数据;
将所述目标读写事件的所述触发数据加入所述触发数据集。
8.根据权利要求7所述的方法,其特征在于,所述将所述目标读写事件的所述触发数据加入所述触发数据集之后,还包括:
将所述目标读写事件中的事件类型信息清除。
9.根据权利要求1所述的方法,其特征在于,所述基于所述目标读写事件,处理所述目标读写事件对应的所述读写任务请求,包括:
获取所述目标读写事件的事件数据;
从所述事件数据中取出所述目标读写任务和待处理数据;
基于所述目标读写任务,对所述待处理数据进行处理。
10.根据权利要求9所述的方法,其特征在于,所述基于所述目标读写任务,对所述待处理数据进行处理,包括:
获取所述目标读写任务中的目标回调函数;
调用所述目标回调函数,对所述待处理数据进行处理。
11.根据权利要求1至10任一所述的方法,其特征在于,所述基于所述目标读写事件,处理所述读写任务请求之后,还包括:
当所述读写任务请求的响应次数达到预设响应次数时,解除任务实例和所述目标读写任务的关联。
12.根据权利要求11所述的方法,其特征在于,所述解除任务实例和所述目标读写任务的关联,包括:
将任务控制函数中操作参数设置为删除事件对应的值;
调用所述任务控制函数,以解除所述任务实例和所述目标读写任务的关联,并将所述目标读写事件从所述任务实例的事件集合中删除。
13.根据权利要求1至10任一所述的方法,其特征在于,所述基于所述目标读写事件,处理所述读写任务请求之后,还包括:
当所述读写任务请求的响应次数未达到预设响应次数时,对所述目标读写事件进行修改,以补充所述目标读写事件中的事件类型信息。
14.根据权利要求13所述的方法,其特征在于,所述对所述目标读写事件进行修改,以补充所述目标读写事件中的事件类型信息,包括:
确定所述目标读写事件的事件类型信息;
将任务控制函数中操作参数设置为修改事件对应的值;
调用所述任务控制函数,对所述目标读写事件进行修改,以补充所述目标读写事件中的事件类型信息。
15.根据权利要求1所述的方法,其特征在于,所述方法,还包括:
当任务等待函数返回第一预设值时,确定所述读写任务请求未响应。
16.根据权利要求1所述的方法,其特征在于,所述方法,还包括:
当所述读写任务请求中每个所述任务对应的所述目标读写任务均处理完成时,确定所述读写任务请求响应完成。
17.一种异步读写装置,其特征在于,所述装置包括:
目标读写任务建立模块,用于基于读写任务请求中包含的任务,分别建立所述任务对应的目标读写任务;所述基于读写任务请求中包含的任务,分别建立所述任务对应的目标读写任务,包括:确定所述读写任务请求中每个所述任务的任务配置信息;基于每个所述任务的所述任务配置信息,分别建立每个所述任务对应的所述目标读写任务;
目标读写事件写入模块,用于将所述目标读写任务放入目标读写事件中;所述目标读写任务与所述目标读写事件一一对应;所述将所述目标读写任务放入目标读写事件中,包括:确定所述目标读写任务对应的所述目标读写事件;将所述目标读写任务写入所述目标读写事件的事件数据中;
读写事件状态确定模块,用于基于触发数据集,确定所述目标读写事件的状态;所述触发数据集中包含处于触发状态的读写事件的触发数据;
读写任务请求处理模块,用于当所述目标读写事件的状态为触发状态时,基于所述目标读写事件,处理所述目标读写事件对应的所述目标读写任务。
18.一种计算机设备,其特征在于,包括:
存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行权利要求1至16中任一项所述的异步读写方法。
19.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机指令,所述计算机指令用于使计算机执行权利要求1至16中任一项所述的异步读写方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311085817.9A CN116820430B (zh) | 2023-08-28 | 2023-08-28 | 异步读写方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311085817.9A CN116820430B (zh) | 2023-08-28 | 2023-08-28 | 异步读写方法、装置、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116820430A CN116820430A (zh) | 2023-09-29 |
CN116820430B true CN116820430B (zh) | 2024-01-09 |
Family
ID=88116971
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311085817.9A Active CN116820430B (zh) | 2023-08-28 | 2023-08-28 | 异步读写方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116820430B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7451447B1 (en) * | 1998-08-07 | 2008-11-11 | Arc International Ip, Inc. | Method, computer program and apparatus for operating system dynamic event management and task scheduling using function calls |
US20180239686A1 (en) * | 2017-02-20 | 2018-08-23 | Tsinghua University | Input and output recording device and method, cpu and data read and write operation method thereof |
CN111651320A (zh) * | 2020-05-20 | 2020-09-11 | 北京中交兴路信息科技有限公司 | 一种高并发连接方法和*** |
CN112685148A (zh) * | 2020-12-07 | 2021-04-20 | 南方电网数字电网研究院有限公司 | 海量终端的异步通信方法、装置、计算机设备和存储介质 |
-
2023
- 2023-08-28 CN CN202311085817.9A patent/CN116820430B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7451447B1 (en) * | 1998-08-07 | 2008-11-11 | Arc International Ip, Inc. | Method, computer program and apparatus for operating system dynamic event management and task scheduling using function calls |
US20180239686A1 (en) * | 2017-02-20 | 2018-08-23 | Tsinghua University | Input and output recording device and method, cpu and data read and write operation method thereof |
CN111651320A (zh) * | 2020-05-20 | 2020-09-11 | 北京中交兴路信息科技有限公司 | 一种高并发连接方法和*** |
CN112685148A (zh) * | 2020-12-07 | 2021-04-20 | 南方电网数字电网研究院有限公司 | 海量终端的异步通信方法、装置、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116820430A (zh) | 2023-09-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11809726B2 (en) | Distributed storage method and device | |
WO2021217529A1 (zh) | 一种进程间通信的方法及*** | |
CN109788068B (zh) | 心跳状态信息上报方法、装置和设备及计算机存储介质 | |
US11184435B2 (en) | Message transmission method and apparatus in cluster file system | |
US20220263772A1 (en) | Metadata driven static determination of controller availability | |
WO2021082465A1 (zh) | 一种保证数据一致性的方法及相关设备 | |
US10158710B2 (en) | Efficient replication of changes to a byte-addressable persistent memory over a network | |
US11397632B2 (en) | Safely recovering workloads within a finite timeframe from unhealthy cluster nodes | |
CN111897666A (zh) | 用于多进程之间通信的方法、设备及*** | |
CN109683818B (zh) | 一种数据存储方法、设备及存储介质 | |
CN115080479B (zh) | 传输方法、服务器、设备、裸金属实例及基板管理控制器 | |
CN114461593B (zh) | 日志写入方法及其装置、电子设备及存储介质 | |
CN114448983A (zh) | 基于ZooKeeper的分布式数据交换方法 | |
JP7322161B2 (ja) | 分散システムにおける非同期ストレージ管理 | |
CN116820430B (zh) | 异步读写方法、装置、计算机设备及存储介质 | |
CN114911421B (zh) | 基于csi插件的数据存储方法、***、装置及存储介质 | |
CN112130900B (zh) | 一种bmc的用户信息管理方法、***、设备以及介质 | |
CN108874560B (zh) | 进行通信的方法和通信设备 | |
CN110502460B (zh) | 数据处理的方法和节点 | |
CN112231290A (zh) | 一种本地日志的处理方法、装置、设备及存储介质 | |
CN113704274B (zh) | 一种数据的读取方法及电子设备 | |
CN112765056B (zh) | 一种预留存储集群lun的方法、***、设备及介质 | |
US20240241756A1 (en) | Restart processing of an application manager component of a device | |
WO2024104289A1 (zh) | 一种消息处理方法、装置、设备及存储介质 | |
CN116016679A (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 |