CN107479981B - 一种基于异步调用实现同步调用的处理方法及装置 - Google Patents
一种基于异步调用实现同步调用的处理方法及装置 Download PDFInfo
- Publication number
- CN107479981B CN107479981B CN201710525773.5A CN201710525773A CN107479981B CN 107479981 B CN107479981 B CN 107479981B CN 201710525773 A CN201710525773 A CN 201710525773A CN 107479981 B CN107479981 B CN 107479981B
- Authority
- CN
- China
- Prior art keywords
- function
- calling
- callback
- parameters
- callback function
- 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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Telephone Function (AREA)
- Telephonic Communication Services (AREA)
Abstract
本发明公开了一种基于异步调用实现同步调用的处理方法及装置,其中的方法包括:获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间;构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。本发明解决了现有技术中异步调用方法容易导致多线程带来的安全和同步的技术问题。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于异步调用实现同步调用的处理方法及装置。
背景技术
计算机在处理任务或事务的过程中,可以采用同步调用或者异步调用的方式,而异步调用可以利用多线程技术而被广泛使用,并且大多用于比较占用时间且容易阻塞的事务,通过异步调用方式可以把该事务交给新的线程完成,而不阻塞当前的线程,当事务完成后,通过callback(回调)等方式通知。
然而,异步调用涉及不同的线程之间共享代码和共享数据,并且需要设置各种状态标志来避免冲突,因此实现较为复杂,并且利用异步调用处理事务时容易出现问题。
可见,现有技术中,异步调用方法容易导致多线程带来的安全和同步的技术问题。
发明内容
本发明提供一种基于异步调用实现同步调用的处理方法及装置,用以解决现有技术中,异步调用方法容易导致多线程带来的安全和同步的技术问题。
本发明第一方面提供了一种基于异步调用实现同步调用的处理方法,包括:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
可选地,所述方法还包括:
如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
可选地,所述根据所述第一函数的参数生成用于同步调用的第二函数,包括:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
可选地,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
基于同样的发明构思,本发明第二方面提供了一种基于异步调用实现同步调用的处理装置,包括:
获取模块,用于获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
生成模块,用于根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间;
异步调用模块,用于构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
同步调用模块,用于如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
可选的,所述装置还包括超时模块,用于如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
可选的,所述生成模块还用于:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
可选的,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
基于同样的发明构思,本发明第三方面提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
基于同样的发明构思,本发明第三方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
本发明的一种基于异步调用实现同步调用的处理方法及装置,通过获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;并根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间,构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。本发明的方法中,一方面生成的用于同步调用的第二函数可以不依赖于第一函数的具体内容,而是通过根据第一函数的参数来生成第二函数的,即不需要知道第一函数的实现代码即可生成第二函数,可以减少编程量从而提高开发效率,另一方面,通过在第二函数中调用所述第一函数,而由于第一函数本身为异步调用函数,则可以通过所述第一函数异步调用所述第一回调函数,然后通过所述第一回调函数的执行结果的等待时间与所述时间参数的比较,再通过所述第二函数同步调用所述第二回调函数,从而在第二函数调用第一函数的过程中,实现了异步到同步的转化,故而实现了同步调用,解决了现有技术中异步调用方法容易导致多线程带来的安全和同步的技术问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中一种基于异步调用实现同步调用的处理方法的流程图;
图2为本发明实施例中一种基于异步调用实现同步调用的处理装置的结构示意图;
图3为本发明实施例中计算机可读存储介质的结构示意图;
图4为本发明实施例中计算机设备的结构示意图。
具体实施方式
本申请实施例通过提供一种基于异步调用实现同步调用的处理方法及装置,用以解决现有的异步调用方法容易导致多线程带来的安全和同步的技术问题。
本申请实施例中的技术方案,总体思路如下:
一种基于异步调用实现同步调用的处理方法,包括:通过获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;并根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间,构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
由于本发明提供上述方法,一方面生成的用于同步调用的第二函数可以不依赖于第一函数的具体内容,而是通过根据第一函数的参数来生成第二函数的,即不需要知道第一函数的实现代码即可生成第二函数,可以减少编程量从而提高开发效率,另一方面,通过在第二函数中调用所述第一函数,而由于第一函数本身为异步调用函数,则可以通过所述第一函数异步调用所述第一回调函数,然后通过所述第一回调函数的执行结果的等待时间与所述时间参数的比较,再通过所述第二函数同步调用所述第二回调函数,从而在第二函数调用第一函数的过程中,实现了异步到同步的转化,故而实现了同步调用,解决了现有技术中异步调用方法容易导致多线程带来的安全和同步的技术问题。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本实施例提供了一种基于异步调用实现同步调用的处理方法,请参考图1,所述方法包括:
步骤S101:获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
步骤S102:生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间,所述第二回调函数和所述第一回调函数之间存在对应关系;
步骤S103:根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
步骤S104:如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
本发明中涉及的同步调用和异步调用以及相关的专业术语的解释如下:
1、异步调用和多线程
异步调用是一种可以无需等待被调用函数的返回值就让当前操作继续执行的方法。在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,当一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方即这段代码才能继续往下执行。随着计算机技术的发展,出现了多线程,多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程。在一个程序中,能够独立运行的程序片段叫“线程”(Thread),利用它编程的概念就叫“多线程处理(Multithreading)”。在多线程应用中,需要考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,需要通过同步来实现线程安全。由于多线程的出现,则可以采用异步调用,即调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等被调方的返回结果就可以继续执行后续代码。由于调用方不等被调方返回结果就去执行其他的代码,因此异步调用中需要通过一种机制让被调方有返回结果时能通知调用方,例如回调等。
2、回调函数
一般通过回调函数来使被调方的返回结果通知调用方,回调函数就是一个通过函数指针调用的函数。如果把函数的指针(即地址)作为参数传递给另一个函数,那么这个指针被用来调用其所指向的函数时,这就是调用回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。
3、同步调用
同步调用就是在发出一个功能调用时,在没有得到返回结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。单线程中函数一般都是同步调用。
下面,结合图1,对本申请提供的基于异步调用实现同步调用的处理方法进行详细描述:
首先,执行步骤S101,获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数。
具体来说,异步调用主要用于比较耗时任务的处理中,例如网络连接,数据库操作等情况中,而异步调用通常不需要等待返回结果即可继续往下执行,则异步调用通过回调来得到返回的通知,本实施例中用于异步调用的第一函数的参数包括第一回调函数,该第一回调函数在第一函数被调用时,同时会被所述第一函数调用。
然后执行步骤S102:根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间;
在具体的实施过程中,用于同步调用的第二函数是根据第一函数的参数来设置,而不依赖于第一函数的具体实现,由于异步调用是***初始设置的,一般来说不容易获取其代码,除非该异步调用是自己设置的。第二函数为同步调用函数,由于同步调用函数需要得到调用结果后才可往下执行,但是等待时间过长,在具体的应用中是不允许或者没有意义的,可以通过时间参数来表征可容许的等待时间。
接下来执行步骤S103:构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
在具体的实施过程中,需要构建第二回调函数和所述第一回调函数之间的对应关系,才能实现第二函数对第一函数的调用,即同步函数对异步函数的调用,举例来说,可以通过赋值操作、参数传递操作等来构建上述对应关系。此时,由于第一函数本身是异步调用函数,则第一函数会异步调用自己的回调函数即第一回调函数,从而可以实现同步函数对异步函数的调用。
最后执行步骤S104:如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
在具体的实施过程中,由于上述步骤中,第二函数在调用第一函数时,第一函数会同时调用本身的第一回调函数,而第二函数是同步调用函数,需要知道上一步的调用结果才回继续往下执行,为了避免等待时间过长,可以通过比较等待第一回调函数的执行结果的时间与上述时间参数的值,从而判断是否执行下个步骤,本实施例中,当所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数时,则通过所述第二函数同步调用所述第二回调函数,由于第二函数是同步调用函数,并且第一回调函数与第二回调函数之间有对应关系,优选地,第一回调函数与第二回调函数的对应关系为相等,则可以使因此第二函数同步调用的第二回调函数和第一函数时调用的第一回调函数为同一个函数,由于第二回调函数的执行和第二函数是在同一个线程,因此本发明的方法中,不需要涉及多线程的问题,因此可以避免多线程带来的安全和同步的技术问题,尽管现有技术中有从异步调用转为同步调用的方法,但是需要获得异步调用的具体内容才可以转为同步调用,并且需要编写复杂的程序代码才能进行转换,实现复杂且开发效率低。而本发明提供的方法则在不需要获取异步调用的具体内容也可以实现从异步调用到同步调用的转换,从而提高了开发的效率以及程序的稳定性。
可选的,所述方法还包括:如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
具体来说,为了避免第二函数长时间地等待第一回调函数的执行结果,本实施通过设置时间参数,并比较所述第一回调函数的执行结果的等待时间与所述时间参数的值之间的关系,来返回超时信息,时间参数的值可以根据具体应用情况设置,例如设置为10ms、20ms、30s等等。当等待时间等于时间参数的值时,则说明到了设定时间了还没等到执行结果,如果再继续等则会产生异常或其他问题,因此返回超时信息,其中超时信息可以通过返回特定的值来返回。
可选地,所述根据所述第一函数的参数生成用于同步调用的第二函数,可以通过下述方法实现:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
具体来说,本发明实施例中的第二函数是根据第一函数的参数生成的,在具体的实施过程中,第一函数的参数包括核心参数和非核心参数,而核心参数是实现第一函数必须用到的参数,为了更好地实现同步的功能,则需要使第二函数的参数包含第一函数的核心参数,本发明实施例中还可以将第二函数的参数包含第一函数所有参数,在此基础上,再增加新的辅助参数例如时间参数等,来进行异步到同步的转化。
可选地,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
为了更清楚地说明书本发明实施例提供的基于异步调用实现同步调用的处理方法的有点和有益效果,下面通过一个用户登录的示例来予以详细说明。
首先获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数,此时的第一函数即为登录函数,登录函数的原型为:
void Login(const char*name,const char*password,void(*onLoginResult)(void*arg),void*arg)。
其中,Login为登录函数的函数名,name、password、(*onLoginResult)(arg)和arg均为登录函数的参数,且为核心参数,name为用户名、password为用户密码、(*onLoginResult)(arg)为第一回调函数,其中*onLoginResult为第一回调函数的指针,arg为第一回调函数的参数。某***使用该Login函数进行登录,该Login函数为异步调用,通过onLoginResult回调函数来反馈登录的结果。
G1BJ178813-1A1但是很多的***在用户登录成功之前,一般也做不了其他操作,此时设计成同步调用,可以提高***的安全性。
然后执行步骤S102,根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间,具体过程如下,由于要实现在不知道登录函数的具体代码,并且不修改异步函数的基础上,将异步调用转换为同步调用,因此,本实施例中设置了同步函数、同步函数所需要调用的参数和相关函数。首先设置了同步函数LoginSync,具体形式如下所示:int LoginSync(const char*name,const char*password,void(*onLoginResult)(void*arg),void*arg,int timeout),由于需要根据异步函数的参数设置同步函数,此时,将同步函数的参数在异步函数的基础上增加一个时间参数timeout,其余参数与登录函数相同,同步函数LoginSync中设置了第二回调函数(*onLoginResult)(void*arg),则在执行同步函数LoginSync时,则会调用上述第二回调函数,第二回调函数的形式如下所示void onLoginSyncResult(void*arg)。此外,为了更好地实现异步调用到同步调用的转化,本发明还设置了两种结构体,SyncHelper结构体和SyncArgs结构体,其中,sturct是结构体的关键字,首先是SyncHelper结构体,形式如下所示:
SyncHelper结构体中,包括HANDLE句柄,表示是Windows用来表示对象,hEvent为信号量,void(*callback)(void*arg)为回调函数,arg表示登录参数,idCurrent表示每一次LoginSync函数调用的标示,可以通过设置idCurrent值来表示LoginSync函数调用完成。
SyncArgs结构体主要是用来作为登录函数调用第一回调函数onLoginSyncResult时的参数,id是与SyncHelper结构体中idCurrent相对应的值,可以用来检查回调函数onLoginResult被登录函数调用时,是否与之对应的LoginSync函数还在等待,这是因为在实际应用过程中回调函数onLoginResult执行时,如果对应的LoginSync函数因为等待超时已经返回,那么再通过登录函数调用第一回调函数就没有任何意义了。
然后执行步骤S103,构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数。具体来说,在设置了上述函数和相关结构体后,通过这些函数的调用和参数传递关系既可以实现基于异步调用实现同步调用的功能,则需要通过同步函数LoginSync调用异步函数Login,具体的流程如下:
首先,创建并赋值SyncHelper类型结构对象,具体来说,定义全局SyncHelper结构对象g_syncHelper(为了封装性,也可以在LoginSync函数内部定义为静态对象),然后将g_syncHelper.idCurrent赋值为0;通过CreateEvent(NULL,FALSE,FALSE,NULL)创建信号量g_syncHelper.hEvent;然后通过赋值操作,使同步函数LoginSync调用异步函数Login,具体来说可以通过将LoginSync函数的参数onLoginResult与arg分别赋值给g_syncHelper.Callback和g_syncHelper.arg;然后通过new动态申请内存创建SyncArgs结构对象sync_arg,再id赋值为g_syncHelper.idCurrent,helper赋值为g_syncHelper;并调用Login函数,将参数Login函数函数的第一回调函数(*onLoginResult)(void*arg)分别赋值为onLoginSyncResult和sync_arg,其他参数与LoginSync相同;
最后执行步骤S104:如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。由于前面设置了信号量hEvent,只有当信号量g_syncHelper.hEvent被激活,或者等待时间超过所述时间参数的值时,该WaitForSingleObject函数才返回结果。WaitForSingleObject函数返回时,g_syncHelper.idCurrent自增,表示本次调用已经结束。根据WaitForSingleObject的返回值进行判断,如果是因为超时而返回,则利用LoginSyn函数通过使用特定的返回值反馈超时消息;如果是因为信号量g_syncHelper.hEvent被激活而返回,则通过所述第二函数同步调用所述第二回调函数,这里用g_syncHelper.callback来实现对第二回调函数onLoginSyncResult的调用,并采用g_syncHelper.arg作为第二回调函数的参数,由于g_syncHelper.callback即调用LoginSync函数是传递的回调函数,而该回调函数和使用异步调用Login函数时传递的回调函数是同一个函数,并且该回调函数的执行和LoginSync函数是在同一个线程,因此不涉及多线程带来的诸多问题。
为了更清楚地说明onLoginSyncResult回调函数流程,下面通过几个具体的步骤予以详细说明,由于传递给Login函数的回调函数为onLoginSyncResult,所以当Login反馈登录结果的时候,会调用onLoginSyncResult函数。该函数流程为,将参数转为SyncArgs结构对象sync_arg,并比较sync_arg->id与sync_arg->helper->idCurrent是否相等,如果相等,则表示当前LoginSync函数还在等待,否则表示该回调对应的LoginSync函数因为超时而返回了,如果相等,可以调用SetEvent(sync_arg->helper->hEvent)来激活信号量g_syncHelper.hEvent,如果不相等,则使用delete释放创建SyncArgs对象动态申请的内存。
通过上述的用户登录的示例,则可以通过同步函数调用异步函数来实现同步调用的,即将异步调用转为同步调用。本发发明在不改变原有异步调用函数的情况下,基于原有的异步调用函数,可以实现异步函数的功能,并且该异步函数的功能是通过同步调用的方式实现的。那么开发者在不改变原有功能的前提下,实现了同步调用的效果,同时也避开了多线程的相关处理,例如同步和安全等问题,大大的提高了开发的效率以及程序的稳定性
基于同样的发明构思,本发明还提供了一种基于异步调用实现同步调用的处理方法相对应的装置,具体参见实施例二
实施例二
本发明实施例提供了一种基于异步调用实现同步调用的处理装置,请参见图2,该装置包括:
获取模块201,用于获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
生成模块202,用于根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间;
异步调用模块203,用于构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
同步调用模块204,用于如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
可选的,所述装置还包括超时模块,用于如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
可选的,所述生成模块202还用于:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
可选的,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
基于同样的发明构思,本发明还提供了一种基于异步调用实现同步调用的处理方法相对应的计算机可读存储介质,具体参见实施例三。
实施例三
本发明实施例提供了一种计算机可读存储介质300,其上存储有计算机程序311,该程序被处理器执行时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
基于同样的发明构思,本发明还提供了一种基于异步调用实现同步调用的处理方法相对应的计算机设备,具体参见实施例四。
实施例四
本发明实施例提供了一种计算机设备,包括存储器401、处理器402及存储在存储器上并可在处理器上运行的计算机程序403,所述处理器执行所述程序时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。存储器401可用于存储计算机程序403,上述计算机程序包括软件程序、模块和数据,处理器402通过运行执行存储在存储器401的计算机程序403,从而执行计算机设备的各种功能应用以及数据处理。
在具体的实施过程中,存储器401可用于存储软件程序以及模块,处理器402通过运行存储在存储器401的软件程序以及模块,从而执行计算机设备的各种功能应用以及数据处理。存储器401可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序等;存储数据区可存储根据计算机设备的使用所创建的数据等。此外,存储器401可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。处理器402是计算机设备的控制中心,利用各种接口和线路连接整个计算机设备的各个部分,通过运行或执行存储在存储器401内的软件程序和/或模块,以及调用存储在存储器401内的数据,执行计算机设备的各种功能和处理数据,从而对计算机设备进行整体监控。可选的,处理器402可包括一个或多个处理单元;优选的,处理器402可集成应用处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
本发明的一种基于异步调用实现同步调用的处理方法及装置,通过获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;并根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间,构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。本发明的方法中,一方面生成的用于同步调用的第二函数可以不依赖于第一函数的具体内容,而是通过根据第一函数的参数来生成第二函数的,即不需要知道第一函数的实现代码即可生成第二函数,可以减少编程量从而提高开发效率,另一方面,通过在第二函数中调用所述第一函数,而由于第一函数本身为异步调用函数,则可以通过所述第一函数异步调用所述第一回调函数,然后通过所述第一回调函数的执行结果的等待时间与所述时间参数的比较,再通过所述第二函数同步调用所述第二回调函数,从而在第二函数调用第一函数的过程中,实现了异步到同步的转化,故而实现了同步调用,解决了现有技术中异步调用方法容易导致多线程带来的安全和同步的技术问题。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种基于异步调用实现同步调用的处理方法,其特征在于,包括:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中,所述第二函数的参数包括第二回调函数和时间参数;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:
如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
3.如权利要求1所述的方法,其特征在于,所述根据所述第一函数的参数生成用于同步调用的第二函数,包括:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
4.如权利要求1所述的方法,其特征在于,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
5.一种基于异步调用实现同步调用的处理装置,其特征在于,包括:
获取模块,用于获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
生成模块,用于根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间参数;
异步调用模块,用于构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
同步调用模块,用于如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
6.如权利要求5所述的装置,其特征在于,所述装置还包括超时模块,用于如果获得所述第一回调函数的执行结果的等待时间等于所述时间参数的值,则返回超时信息。
7.如权利要求5所述的装置,其特征在于,所述生成模块还用于:
获取所述第一函数的参数,所述第一函数的参数包括核心参数;
根据所述第一函数的参数设置第二函数的参数,使所述第二函数的参数包含所述核心参数。
8.如权利要求5所述的装置,其特征在于,所述第二回调函数和所述第一回调函数之间的对应关系通过下述方式建立:
将所述第二回调函数的参数值赋值给所述第一回调函数。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间参数;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现以下步骤:
获取预设的用于异步调用的第一函数,所述第一函数的参数包括第一回调函数;
根据所述第一函数的参数生成用于同步调用的第二函数,其中所述第二函数的参数包括第二回调函数和时间参数;
构建所述第二回调函数与所述第一回调函数的对应关系,并根据所述对应关系,在所述第二函数中调用所述第一函数,通过所述第一函数异步调用所述第一回调函数;
如果获得所述第一回调函数的执行结果的等待时间小于所述时间参数的值,则通过所述第二函数同步调用所述第二回调函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710525773.5A CN107479981B (zh) | 2017-06-30 | 2017-06-30 | 一种基于异步调用实现同步调用的处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710525773.5A CN107479981B (zh) | 2017-06-30 | 2017-06-30 | 一种基于异步调用实现同步调用的处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107479981A CN107479981A (zh) | 2017-12-15 |
CN107479981B true CN107479981B (zh) | 2020-02-07 |
Family
ID=60594859
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710525773.5A Active CN107479981B (zh) | 2017-06-30 | 2017-06-30 | 一种基于异步调用实现同步调用的处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107479981B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110659141B (zh) * | 2018-06-30 | 2022-01-04 | 武汉斗鱼网络科技有限公司 | 一种指令执行的方法以及相关设备 |
CN110806867B (zh) * | 2018-08-06 | 2022-06-17 | 武汉斗鱼网络科技有限公司 | 一种Handle管理方法、存储介质、电子设备及*** |
CN109067669A (zh) * | 2018-09-06 | 2018-12-21 | 华泰证券股份有限公司 | 基于异步接口的同步调用方法及应用 |
CN110737428B (zh) * | 2019-10-21 | 2023-08-15 | Oppo广东移动通信有限公司 | 基于Hidl的通用接口设计方法、装置、终端及可读存储介质 |
CN111212085B (zh) * | 2020-01-16 | 2022-11-22 | 厦门网宿有限公司 | 物联网平台同步调用的方法、物联网***和网络设备 |
CN113190624A (zh) * | 2021-05-21 | 2021-07-30 | 中国工商银行股份有限公司 | 基于分布式跨容器的异步转同步调用方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH09330287A (ja) * | 1996-06-12 | 1997-12-22 | Hitachi Ltd | クライアントサーバ型システムの機能非同期呼び出し方法 |
CN101674326A (zh) * | 2009-09-21 | 2010-03-17 | 中兴通讯股份有限公司 | 进程间同步通信实现方法及代理单元 |
CN102064954A (zh) * | 2009-11-17 | 2011-05-18 | 腾讯科技(深圳)有限公司 | 一种分布式容错***、设备和方法 |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
CN106293970A (zh) * | 2016-08-09 | 2017-01-04 | 浪潮(北京)电子信息产业有限公司 | 一种基于ipc的进程间异步处理方法及*** |
-
2017
- 2017-06-30 CN CN201710525773.5A patent/CN107479981B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH09330287A (ja) * | 1996-06-12 | 1997-12-22 | Hitachi Ltd | クライアントサーバ型システムの機能非同期呼び出し方法 |
CN101674326A (zh) * | 2009-09-21 | 2010-03-17 | 中兴通讯股份有限公司 | 进程间同步通信实现方法及代理单元 |
CN102064954A (zh) * | 2009-11-17 | 2011-05-18 | 腾讯科技(深圳)有限公司 | 一种分布式容错***、设备和方法 |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
CN106293970A (zh) * | 2016-08-09 | 2017-01-04 | 浪潮(北京)电子信息产业有限公司 | 一种基于ipc的进程间异步处理方法及*** |
Also Published As
Publication number | Publication date |
---|---|
CN107479981A (zh) | 2017-12-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107479981B (zh) | 一种基于异步调用实现同步调用的处理方法及装置 | |
KR102466984B1 (ko) | 중앙 프로세싱 유닛(cpu)과 보조 프로세서 사이의 개선된 함수 콜백 메커니즘 | |
EP1880289B1 (en) | Transparent support for operating system services | |
EP3230860B1 (en) | Technologies for efficient synchronization barriers with work stealing support | |
CN108717380B (zh) | 消息处理方法和装置 | |
CN103365718A (zh) | 一种线程调度方法、线程调度装置及多核处理器*** | |
US20130231912A1 (en) | Method, system, and scheduler for simulating multiple processors in parallel | |
CN110795254A (zh) | 一种基于php处理高并发io的方法 | |
US20130086154A1 (en) | System and method for providing asynchrony in web services | |
CN110795150A (zh) | 依dmb操作用加载/存储操作实施加载撷取/存储释放指令 | |
CN113282436A (zh) | 事件处理方法、装置、设备以及存储介质 | |
CN115495262A (zh) | 一种微内核操作***及进程间消息的处理方法 | |
US9703905B2 (en) | Method and system for simulating multiple processors in parallel and scheduler | |
CN111294377B (zh) | 一种依赖关系的网络请求发送方法、终端装置及存储介质 | |
CN112445614B (zh) | 一种线程数据的存储管理方法、计算机设备及存储介质 | |
JP7122299B2 (ja) | 処理タスクを実行するための方法、装置、デバイス、および記憶媒体 | |
TW200905567A (en) | Notifying user mode scheduler of blocking events | |
CN112395062A (zh) | 任务处理方法、装置、设备及计算机可读存储介质 | |
EP4404057A1 (en) | Method and apparatus for obtaining lock resources, and device | |
CN111241594A (zh) | 交易信息的加签方法、装置、计算机设备和存储介质 | |
US9348667B2 (en) | Apparatus for managing application program and method therefor | |
CN109783242A (zh) | 海外控股估值流程控制方法、装置、计算机设备及存储介质 | |
CN109388497B (zh) | 一种内存池的管理方法、装置、设备及可读存储介质 | |
CN110618794B (zh) | 一种SSD固件访问NandFlash的方法和*** | |
CN102867018A (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 | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230824 Address after: 518000, podium building 836, Building 12, Shenzhen Bay Science and Technology Ecological Park, No. 18 Keji South Road, Gaoxin District, Yuehai Street, Nanshan District, Shenzhen City, Guangdong Province Patentee after: Shenzhen Shensheng Technology Co.,Ltd. Address before: 430000 East Lake Development Zone, Wuhan City, Hubei Province, No. 1 Software Park East Road 4.1 Phase B1 Building 11 Building Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd. |