任务处理方法及装置与流程

文档序号:24413016发布日期:2021-03-26 20:05阅读:83来源:国知局
任务处理方法及装置与流程

1.本说明书涉及数据处理技术领域,特别涉及任务处理方法及装置。


背景技术:

2.游戏服务器在需要对数据库中的数据进行数据处理时,通常是通过数据库管理中转服务与数据库交互,但这种方式需要用到额外的数据库管理中转服务,会导致很多服务器性能上的损耗。因此,为了减少服务器性能的损耗,且不阻塞游戏服务器的主线程,可以创建工作线程来与数据库进行交互,但如此又会存在多线程之间数据访问的安全问题。
3.现有技术中,可以通过锁机制来解决上述问题。具体地,当某个工作线程要对队列进行访问时,需要获取该队列的队列锁,然后才能对该队列进行相应的读写访问,当队列锁被某个工作线程取得时,其他工作线程则无法对该队列进行访问。
4.但在上述方式中,若多个工作线程需要并行访问队列,没有取得队列锁的工作线程可能需要一直等待而无法执行其他操作,不但浪费服务器的处理资源,还会降低服务器获取队列中任务的效率,进而降低任务处理的效率。


技术实现要素:

5.有鉴于此,本说明书实施例提供了一种任务处理方法。本说明书同时涉及一种获取数据的装置,一种计算设备,以及一种计算机可读存储介质,以解决现有技术中存在的技术缺陷。
6.根据本说明书实施例的第一方面,提供了一种任务处理方法方法,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,包括:
7.所述主线程将待处理任务写入待处理任务队列;
8.所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
9.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
10.可选地,所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一代处理任务并备份,得到所述至少一个工作线程对应的备份任务之后,还包括:
11.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同的情况下,所述目标工作线程删除所述备份任务。
12.可选地,确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同,包括:
13.将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若
所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同。
14.可选地,确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同,包括:
15.将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同。
16.可选地,所述目标工作线程执行所述备份任务,包括:
17.所述目标工作线程基于所述备份任务对数据库中的数据进行处理,并将任务处理结果反馈给所述主线程。
18.可选地,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并将任务处理结果反馈给所述主线程,包括:
19.所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果;
20.所述目标工作线程将所述任务处理结果写入结果反馈队列;
21.所述主线程从所述结果反馈队列中获取所述任务处理结果。
22.可选地,所述待处理任务包括任务标识,则所述备份任务中包括所述任务标识,所述目标工作线程获取所述任务处理结果,包括:
23.所述目标工作线程获取携带所述任务标识的所述任务处理结果。
24.可选地,所述主线程从所述结果反馈队列中获取所述任务处理结果,包括:
25.所述主线程基于所述任务标识从所述结果反馈队列中获取所述任务处理结果。
26.可选地,若所述备份任务为数据获取任务,则所述任务处理结果为所述数据获取任务对应的目标数据,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果,包括:
27.所述目标工作线程从所述数据库中获取所述数据获取任务对应的目标数据。
28.可选地,若所述备份任务为数据查询任务,则所述任务处理结果为所述数据查询任务对应的数据查询结果,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果,包括:
29.所述目标工作线程,在所述数据库中查询与所述数据查询任务对应的待查询数据,得到所述数据查询结果。
30.可选地,若所述备份任务为数据更新任务,则所述任务处理结果为所述数据更新任务对应的更新数据,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果,包括:
31.所述目标工作线程,对所述数据库中与所述数据更新任务对应的待更新数据进行更新,得到所述更新数据。
32.可选地,所述主线程将待处理任务写入待处理任务队列之前,还包括:
33.所述主线程接收所述待处理任务对应的回调函数。
34.可选地,所述待处理任务基于用户的操作生成并由客户端发送至所述服务器,所述方法还包括:
35.所述主线程调用所述回调函数将所述任务处理结果发送至所述客户端。
36.根据本说明书实施例的第二方面,提供了一种任务处理方法装置,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,包括:
37.任务写入模块,被配置为通过所述主线程将待处理任务写入待处理任务队列;
38.任务获取模块,被配置为通过所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
39.任务执行模块,被配置为在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,通过所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
40.根据本说明书实施例的第三方面,提供了一种计算设备,包括:
41.存储器和处理器;
42.所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
43.所述主线程将待处理任务写入待处理任务队列;
44.所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
45.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
46.根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该指令被处理器执行时实现所述任务处理方法的步骤。
47.本说明书提供的任务处理方法,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,所述主线程将待处理任务写入待处理任务队列;所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,可以认为第一待处理任务未被其他工作线程获取,不会出现被重复执行的情况,则所述目标工作线程可以删除所述第二待处理任务,并执行所述备份任务。本说明书实施例中,两个或两个以上的工作线程可以并行从待处理任务队列中获取待处理任务,无需等待,可以降低游戏服务器资源的消耗,提高获取待处理队列中待处理任务的效率。并且,工作线程获取到备份任务后不会立即执行,而是在确定备份任务未被其他工作线程执行的情况下再执行,可以避免多个工作线程获取到同一个待处理任务,导致待处理任务被重复执行的情况,减少了服务器资源的浪费,提高了任务获取的安全性,进而提高了队列访问的安全性。
附图说明
48.图1是本说明书一实施例提供的一种任务处理方法的流程图;
49.图2是本说明书一实施例提供的一种工作线程获取待处理任务的示意图;
50.图3是本说明书一实施例提供的另一种工作线程获取待处理任务的示意图;
51.图4是本说明书一实施例提供的一种应用于数据获取任务的任务处理方法的处理流程图;
52.图5是本说明书一实施例提供的又一种工作线程获取待处理任务的示意图;
53.图6是本说明书一实施例提供的一种任务处理装置的结构示意图;
54.图7是本说明书一实施例提供的一种计算设备的结构框图。
具体实施方式
55.在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
56.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
57.应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
58.首先,对本说明书一个或多个实施例涉及的名词术语进行解释。
59.主线程:在本说明书实施例的游戏场景中可以是游戏服务器的主线程。
60.工作线程:在本说明书实施例的游戏场景中可以是游戏服务器创建的除主线程之外的其他线程。
61.目标工作线程:可以是能够执行备份任务的工作线程,也可以是不能执行备份任务的工作线程,根据情况不同目标工作线程对备份任务的执行能力不同。具体可参见下述实施例的相关描述。
62.待处理任务:可以是需要游戏服务器执行的任务。
63.第一待处理任务:写入待处理任务队列的任务均称为待处理任务,为了与待处理任务队列中其他位置的待处理任务进行区分,可以将目标位置处的待处理任务称为第一待处理任务。
64.第二待处理任务:与第一待处理任务可能相同,也可能不同,且第一待处理任务和第二待处理任务均处于待处理任务队列的目标位置处。由于获取备份任务时目标位置处的待处理任务和获取备份任务后目标位置处的待处理任务可能相同也可能不同,为了进行区分,可以将获取备份任务后目标位置处的待处理任务称为第二待处理任务。
65.队列:一种常用的数据结构,可以用于存储数据。且可以在队列的一端进行数据删除操作,而在队列的另一端进行数据写入操作。
66.待处理任务队列:存储待处理任务的队列,即队列中的元素是待处理任务。
67.结果反馈队列:存储任务处理结果的队列,即队列中的元素是执行待处理任务后的任务处理结果。
68.回调函数:回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,可以称为回调函数。
69.cas机制:(compare and swap,比较并替换)机制,用于解决多线程并行情况下使用锁造成性能损耗的一种机制。
70.在本说明书中,提供了一种任务处理方法,本说明书同时涉及一种获取数据的装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
71.图1示出了根据本说明书一实施例提供的一种任务处理方法的流程图,应用于游戏服务器,具体可以包括以下步骤:
72.步骤102,所述主线程将待处理任务写入待处理任务队列。
73.在一些实施例中,待处理任务可以基于用户的操作生成并由客户端发送至游戏服务器,通过游戏服务器的主线程接收,且待处理任务是游戏服务器需要执行的任务。作为一种示例,该待处理任务可以是数据获取任务、数据查询任务、数据更新任务等,本说明书实施例对此不做限定。例如,待处理任务可以是更新商城数据,查询金币数量、获取背包中道具的数据等。
74.在一些实施例中,用户可以在客户端提供的ui(user interface,用户界面)进行操作,客户端则会基于该操作生成待处理任务,客户端将该待处理任务发送给服务器,相应地,服务器可以通过主线程接收该待处理任务,并将该待处理任务写入待处理任务队列中。
75.在本说明书实施例中,主线程将待处理任务写入待处理队列时,可以认为该主线程是多线程数据交互中的生产者线程,用于接收待处理任务,并将待处理任务写入待处理队列中,以便于消费者线程可以从待处理队列中获取待处理任务并执行。
76.进一步地,主线程将待处理任务写入待处理任务队列之前,还包括:所述主线程接收所述待处理任务对应的回调函数。
77.作为一种示例,回调函数是一个作为参数被回调的函数。在本说明书实施例中,主线程通过调用回调函数可以向发送待处理任务的设备反馈任务处理结果。
78.也就是说,在主线程接收待处理任务时,也可以接收该待处理任务的回调函数,以便于在待处理任务被执行完成后可以将任务结果及时反馈给客户端。
79.如此,不需要客户端实时监测待处理任务是否已经执行完成,减少客户端的操作,进而减少客户端的处理资源消耗。
80.步骤104,所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务。
81.其中,该目标位置可以是待处理任务队列的队尾,也可以是待处理任务队列的队头。
82.需要说明的是,为了区分待处理任务队列中不同位置处的待处理任务,将目标位置处的待处理任务称为第一待处理任务。
83.在本说明书实施例中,游戏服务器可以创建至少两个工作线程。该至少两个工作线程可以认为是多线程数据交互中的消费者线程,用于从待处理任务队列中获取待处理任务。并且,该至少两个工作线程可能不会同时从待处理任务队列中获取待处理任务,也可能会同时从待处理任务队列中获取待处理任务。
84.在实施中,工作线程可以对队列进行操作,则至少两个工作线程中的至少一个工作线程可以从待处理任务队列中获取目标位置处的第一待处理任务,并将获取到的第一待处理任务进行备份得到备份任务,即可以得到至少一个工作线程对应的备份任务。
85.作为一种示例,以目标位置为队头为例,假设队头的第一待处理任务是a1,至少两个工作线程可以是线程1、线程2和线程3,至少两个工作线程中的至少一个工作线程可以是线程1。参见图2,线程1可以获取待处理任务队列的队头的第一待处理任务a1,并将获取到的第一待处理任务a1进行备份,得到线程1对应的备份任务a1。
86.作为另一种示例,以目标位置为队尾为例,假设队尾的第一待处理任务是a5,至少两个工作线程可以是线程1、线程2和线程3,至少两个工作线程中的至少一个工作线程可以是线程1和线程2。参见图3,线程1和线程2可以并行获取待处理任务队列的队尾的第一待处理任务a5,并将获取到的第一待处理任务进行备份,则可以得到线程1对应的备份任务a5和线程2对应的备份任务a5。另外,虽然线程1和线程2是并行获取第一待处理任务a5,但在时间上也会有先后顺序。参见图3,假设线程1先获取队尾的第一待处理任务a5并进行备份,得到备份任务a5,然后线程1挂起,切换至线程2,线程2获取队尾的第一待处理任务a5并进行备份,得到备份任务a5。
87.在本说明书实施例中,可以是一个工作线程对待处理队列进行操作,即从待处理队列中获取目标位置处的第一待处理任务,也可以是两个或两个以上的工作线程同时对待处理队列进行操作,即两个或两个以上的工作线程同时从待处理队列中获取目标位置处的第一待处理任务。如此,在一个工作线程对待处理队列进行操作时,不会将该待处理队列进行上锁,则其他工作线程也可以对该待处理队列进行操作,不会出现工作线程等待而不能执行其他操作的情况,不仅不会浪费服务器的处理资源,还可以提高获取待处理队列中待处理任务的效率。
88.步骤106,在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
89.在实施中,多个工作线程之间是相互独立的,因此一个工作线程并不确定其他工作线程的任务获取情况,因此,至少一个工作线程获取到第一待处理任务的备份任务后,为了避免多个工作线程获取该第一待处理任务,导致该第一待处理任务被重复执行,至少一个工作线程不会立即执行该第一待处理任务,而是先确定是否有其他工作线程获取到该第一待处理任务,在确定没有其他工作线程获取到该第一待处理任务的情况下,可以执行备份的备份任务,并将待处理队列中目标位置处的第一待处理任务删除,避免其他工作线程获取到待第一待处理任务,进而避免多个工作线程执行同一个待处理任务,浪费游戏服务器的处理资源的问题。
90.在一些实施例中,确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同的具体实现可以包括:将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同。
91.其中,第二待处理任务是目标位置当前的待处理任务,可能与第一待处理任务相同,也可能与第一待处理任务不相同。
92.也就是说,可以将至少一个工作线程对应的备份任务与第二待处理任务进行比对,若至少一个工作线程对应的备份任务中存在与第二待处理任务相同的目标备份任务,则说明该目标位置处的第一待处理任务未被其他工作线程获取,可以将目标备份任务对应的工作线程确定为目标工作线程,且可以确定至少一个工作线程的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同。
93.在该种情况下,若至少一个工作线程的数量为大于或等于两个,则至少一个工作线程需要依次将备份任务与第二待处理任务进行比对,则目标工作线程可以是至少一个工作线程中第一个将备份任务与第二待处理任务进行比对的工作线程。
94.示例性地,参见图2,若线程1将其对应的备份任务与第二待处理任务进行比对,且线程1对应的备份任务a1与第二待处理任务a1相同,则可以将线程1确定为目标工作线程。参见图3,若线程2先将其对应的备份任务与第二待处理任务进行比对,且线程2对应的备份任务a5与第二待处理任务a5相同,则可以将线程2确定为目标工作线程。
95.在实施中,所述目标工作线程执行所述备份任务的具体实现可以包括:所述目标工作线程基于所述备份任务对数据库中的数据进行处理,并将任务处理结果反馈给所述主线程。
96.作为一种示例,备份任务可以是对数据库中的数据进行处理,因此,在目标工作线程确定第一待处理任务未被其他工作线程获取的情况下,可以根据备份任务对数据库中的数据进行处理,并得到任务处理结果反馈至主线程。
97.在一些实施例中,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并将任务处理结果反馈给所述主线程的具体实现可以包括:所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果;所述目标工作线程将所述任务处理结果写入结果反馈队列;所述主线程从所述结果反馈队列中获取所述任务处理结果。
98.也就是说,目标工作线程可以根据备份任务对数据库中的数据进行处理,获取数据处理的结果作为任务处理结果,并将任务处理结果写入结果反馈队列中以供主线程从结果反馈队列中获取任务处理结果。
99.在本说明书实施例中,目标工作线程将任务处理结果写入结果反馈队列时,可以认为该目标工作线程时多线程交互中的生产者线程,用于接收任务处理结果,并将任务处理结果写入结果反馈队列中,以便于消费者线程可以从结果反馈队列中获取任务处理结果。
100.在本说明书实施例中,在待处理任务不用的情况下,目标工作线程基于备份任务对数据库中的数据进行处理,获取任务处理结果的实现方式可以是不同的。
101.在一种可能的实现方式中,若所述备份任务为数据获取任务,则所述任务处理结果为所述数据获取任务对应的目标数据,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果的具体实现可以包括:所述目标工作线程从所述数据库中获取所述数据获取任务对应的目标数据。
102.也就是说,如果第一待处理任务是数据获取任务,即备份任务为数据获取任务,则任务处理结果是执行数据获取任务获取的目标数据。在该种情况下,目标工作线程可以从数据库中获取数据获取任务对应的目标数据。
103.作为一种示例,数据库中可以预先存储有游戏场景中各个模块的数据,以及数据与各个模块的模块标识之间的对应关系,目标工作线程可以对数据获取任务进行解析,得到数据获取任务对应的模块标识,基于该模块标识从数据库中获取对应的目标数据。
104.示例性的,假设数据获取任务是“获取商城数据”,则对该数据获取任务进行解析,可以得到模块标识是“商城”,则可以基于数据与模块标识之间的对应关系,获取数据库中“商城”对应的数据作为目标数据。
105.在另一种可能的实现方式中,若所述备份任务为数据查询任务,则所述任务处理结果为所述数据查询任务对应的数据查询结果,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果的具体实现可以包括:所述目标工作线程,在所述数据库中查询与所述数据查询任务对应的待查询数据,得到所述数据查询结果。
106.也就是说,如果第一待处理任务是数据查询任务,即备份任务为数据查询任务,则任务处理结果可以是执行数据查询任务后得到的数据查询结果。在该种情况下,目标工作线程可以从数据库中获取数据查询任务对应的数据查询结果。
107.作为一种示例,数据库中可以预先存储有游戏场景中各个模块的数据,以及数据与各个模块的模块标识之间的对应关系,目标工作线程可以对数据查询任务进行解析,得到数据查询任务对应的模块标识,基于该模块标识查询该模块标识对应的待查询数据,得到数据查询结果。
108.示例性的,假设数据查询任务是“查询背包中道具的数量”,则对该数据查询任务进行解析,可以得到模块标识为“背包”,则可以基于数据与模块标识之间的对应关系,确定数据库中“背包”对应的数据作为待查询数据,假设背包对应的数据包括a道具、b道具和c道具,则确定数据查询结果是3个。
109.在又一种可能的实现方式中,若所述备份任务为数据更新任务,则所述任务处理结果为所述数据更新任务对应的更新数据,所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果的具体实现可以包括:所述目标工作线程,对所述数据库中与所述数据更新任务对应的待更新数据进行更新,得到所述更新数据。
110.也就是说,如果第一待处理任务是数据更新任务,即备份任务为数据更新任务,则任务处理结果是执行数据更新任务获取的更新数据。在该种情况下,目标工作线程可以从数据库中获取数据更新任务对应的更新数据。
111.作为一种示例,数据库中可以预先存储有游戏场景中各个模块的数据,以及数据
与各个模块的模块标识之间的对应关系,目标工作线程可以对数据更新任务进行解析,得到数据更新任务对应的模块标识,基于该模块标识对该模块标识对应的数据进行更新,得到更新后的数据作为更新数据。
112.示例性的,假设数据更新任务是“使用100金币”,则对该数据更新任务进行解析,可以得到模块标识为“金币”,则可以基于数据与模块标识之间的对应关系,确定数据库中“金币”对应的数据,假设金币对应的数据为1000,则可以对该数据进行更新,减少100金币,则更新数据可以是900金币。
113.在一些实施例中,所述待处理任务包括任务标识,则所述备份任务中包括所述任务标识,所述目标工作线程获取所述任务处理结果的具体实现可以包括:所述目标工作线程获取携带所述任务标识的所述任务处理结果。
114.其中,任务标识可以用于唯一指示一个待处理任务,且任务标识可以是编号、字母、数字等,本说明书实施例对此不做限定。
115.作为一种示例,为了区分不用的待处理任务,待处理任务中可以包括任务标识,因此,目标工作线程对应的备份任务中可以包括任务标识,在获取任务处理结果时,可以将任务标识携带在任务处理结果中。如此,便于将不同的待处理任务的任务处理结果进行区分,避免出现获取到错误的任务处理结果的情况。
116.作为一种示例,若备份任务是数据获取任务,则任务处理结果是目标数据,则目标工作线程可以获取携带任务标识的目标数据。若备份任务是数据查询任务,则任务处理结果是数据查询结果,则目标工作线程可以获取携带任务标识的数据查询结果。若备份任务是数据更新任务,则任务处理结果是更新数据,则目标工作线程可以获取携带任务标识的更新数据。
117.在一些实施例中,所述主线程从所述结果反馈队列中获取所述任务处理结果的具体实现可以包括:所述主线程基于所述任务标识从所述结果反馈队列中获取所述任务处理结果。
118.作为一种示例,在备份任务包括任务标识的情况下,目标工作线程可以将携带任务标识的任务处理结果写入结果反馈队列中,主线程也可以在获取待处理任务时获取任务标识,则主线程可以基于任务标识从结果反馈队列中获取任务标识对应的任务处理结果。
119.作为一种示例,若备份任务是数据获取任务,则任务处理结果是携带任务标识的目标数据,则主线程可以从结果反馈队列中获取携带任务标识的目标数据。若备份任务是数据查询任务,则任务处理结果是携带任务标识的数据查询结果,则主线程可以获取携带任务标识的数据查询结果。若备份任务是数据更新任务,则任务处理结果是携带任务标识的更新数据,则主线程可以获取携带任务标识的更新数据。
120.在一些实施例中,所述方法还包括:所述主线程调用所述回调函数将所述任务处理结果发送至所述客户端。
121.也就是说,在主线程接收待处理任务的同时,也可以接收该待处理任务的回调函数,且主线程可以通过调用该回调函数将任务处理结果发送至发送待处理任务的客户端。
122.如此,不需要客户端实时监测待处理任务是否已经执行完成,主线程可以在待处理任务执行完成时调用回调函数通知客户端,减少了客户端的操作,也减少了客户端和游戏服务器的数据交互,进而减少了客户端和游戏服务器的处理资源消耗。
123.需要说明的是,上述是在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下执行的操作。接下来介绍另外一种情况。
124.进一步地,所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务之后,还包括:在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同的情况下,所述目标工作线程删除所述备份任务。
125.也就是说,至少一个工作线程获取到备份任务后,不会立即执行该第一待处理任务,而是先确定是否有其他工作线程获取到该第一待处理任务,在确定有其他工作线程获取到该第一待处理任务的情况下,可以将备份的备份任务删除,不执行该备份任务。
126.如此,可以避免多个工作线程执行同一个待处理任务,浪费游戏服务器的处理资源的问题。
127.进一步地,目标工作线程将备份任务删除后,可以重新获取目标位置处当前的第二待处理任务并备份,得到备份数据。
128.在一些实施例中,确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同的具体实现可以包括:将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同。
129.也就是说,可以将至少一个工作线程对应的备份任务与第二待处理任务进行比对,若至少一个工作线程对应的备份任务中不存在与第二待处理任务相同的目标备份任务,则说明该目标位置处的第一待处理任务已经被其他工作线程获取,则该目标工作线程不能重复执行该第一待处理任务,因此,可以将目标备份任务对应的工作线程确定为目标工作线程,且可以将备份任务删除。
130.在该种情况下,若至少一个工作线程的数量为大于或等于两个,则至少一个工作线程需要依次将备份任务与第二待处理任务进行比对,则目标工作线程可以是至少一个工作线程中非首个将备份任务与第二待处理任务进行比对的工作线程。
131.示例性地,参见图3,若线程2先将其对应的备份任务与第二待处理任务进行比对,且线程2对应的备份任务a5与第二待处理任务a5相同,则线程2会执行删除a5的操作,线程2挂起,切换至线程1,由于线程2已经将待处理任务队列中的a5删除,此时队尾是第二待处理任务a4,则线程1再将对应的备份任务a5与第二待处理任务a4进行比对,可以确定备份任务a5与第二待处理任务a4不同,可以认为该第一待处理任务a5已经被其他工作线程获取,则可以将线程1确定为目标工作线程,且线程1可以将备份任务a5删除。
132.本说明书实施例中,由于若某工作线程获取了某待处理任务则会立即将待处理任务队列中的第一待处理任务删除,工作线程在获取到备份任务后不会直接执行,而是将备份任务和目标位置处当前的第二待处理任务进行比对,在确定备份任务未被删除,即该备
份任务未被执行的情况下,才执行该备份任务,否则删除备份任务。如此,可以避免多个工作线程获取到同一个待处理任务,导致待处理任务被重复执行,浪费服务器资源的情况,且提高了任务获取的安全性。
133.另外,相对于现有技术需要加锁的实现方式,由于多个工作线程对同一个队列进行操作的可能性是比较小的,为了小概率冲突将整个队列锁住比较浪费游戏服务器的资源。本说明书实施例中采用的是并发无锁队列,该并发无锁队列采用cas机制,支持多个线程并行对一个队列进行访问,无需等待,可以降低游戏服务器资源的消耗,且多个线程不会获取到同一个任务,提高了任务获取的安全性,进而提高了队列访问的安全性。
134.作为一种示例,cas机制包含三个操作数——内存位置(v)、预期原值(a)和新值(b)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。cas机制有效地说明了“我认为位置v应该包含值a;如果包含该值,则将b放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。
135.结合本说明书实施例,内存位置可以是目标位置,预期原值可以是备份任务,新值可以是第一待处理任务被删除后处于目标位置的第二待处理任务。如果目标位置当前的待处理任务与备份任务相同,则目标工作线程会将目标位置处的第一待处理任务删除,并将第二待处理任务更新为目标位置处的待处理任务,否则,目标工作线程可以重新获取目标位置当前的待处理任务。
136.本说明书提供的任务处理方法,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,所述主线程将待处理任务写入待处理任务队列;所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,可以认为第一待处理任务未被其他工作线程获取,不会出现被重复执行的情况,则所述目标工作线程可以删除所述第二待处理任务,并执行所述备份任务。本说明书实施例中,两个或两个以上的工作线程可以并行从待处理任务队列中获取待处理任务,无需等待,可以降低游戏服务器资源的消耗,提高获取待处理队列中待处理任务的效率。并且,工作线程获取到备份任务后不会立即执行,而是在确定备份任务未被其他工作线程执行的情况下再执行,可以避免多个工作线程获取到同一个待处理任务,导致待处理任务被重复执行的情况,减少了服务器资源的浪费,提高了任务获取的安全性,进而提高了队列访问的安全性。
137.图4是本说明书一实施例提供的一种应用于数据获取任务的任务处理方法的处理流程图,接下来以任务处理方法在数据获取任务中的应用为例对任务处理方法进行说明,具体可以包括如下步骤:
138.步骤402,主线程接收来自客户端的数据获取任务和回调函数,其中,数据获取任务包括任务标识。
139.示例性地,用户可以通过客户端提供的ui界面对商城选项进行触发,则客户端响应于该触发操作会生成数据获取任务,该数据获取任务可以是“获取商城数据”,客户端生成数据获取任务后发送至游戏服务器,游戏服务器可以通过主线程接收到该数据获取任务。
140.在本说明书实施例中,数据获取任务可以是任何任务,本说明书实施例对此不做限定。本实施例仅以数据获取任务是“获取商城数据”为例。
141.步骤404,主线程将数据获取任务写入待处理任务队列。
142.步骤406,线程1和线程2并行从待处理任务队列中获取队尾的数据获取任务a6并备份,得到线程1对应的备份任务a6和线程2对应的备份任务a6。
143.示例性地,虽然线程1和线程2并行获取队尾的数据获取任务,但在时间上还有存在先后顺序。参见图5,线程1可以先获取队尾的数据获取任务a6并进行备份,得到备份任务a6,然后线程1挂起,切换至线程2,线程2获取队尾的数据获取任务a6并进行备份,得到备份任务a6。
144.步骤408,线程1将备份任务a6和队尾当前的数据获取任务a6进行比对,确定备份任务与队尾当前的数据获取任务相同,则线程1可以将队尾当前的数据获取任务a6删除,并执行步骤412。
145.示例性地,参见图5,线程1先将其对应的备份任务a6与队尾当前的数据获取任务a6进行比对,且线程1对应的备份任务a6与队尾当前的数据获取任务a6相同,则线程1可以删除待处理任务队列中队尾的数据获取任务a6。
146.步骤410,线程2将备份任务a6与目标位置当前的数据获取任务a5进行比对,确定备份任务与队尾当前的数据获取任务不同,则线程2可以将备份任务a6删除。
147.示例性地,参见图5,线程1将a6删除后,线程1挂起,切换至线程2,由于线程1已经将待处理任务队列中的a6删除,此时队尾是数据获取任务a5,则线程1将对应的备份任务a6与队尾的数据获取任务a5进行比对,可以确定备份任务a6与队尾的数据获取任务a5不同,可以认为该数据获取任务a6已经被其他工作线程获取,则线程1可以将备份任务a6删除,并且线程1可以重新从待处理任务队列中获取数据获取请求。
148.步骤412,线程1基于备份任务a6从数据库中获取a6对应的目标数据,该目标数据携带任务标识。
149.示例性地,数据库中可以预先存储有游戏场景中各个模块的数据,以及数据与各个模块的模块标识之间的对应关系,线程1对数据获取任务“获取商城数据”进行解析,可以得到模块标识是“商城”,则可以基于数据与模块标识之间的对应关系,获取数据库中“商城”对应的数据作为目标数据。数据获取任务包括任务标识,则目标数据可以携带任务标识。
150.步骤414,线程1将携带任务标识的目标数据写入结果反馈队列。
151.步骤416,主线程基于任务标识从结果反馈队列中获取目标数据。
152.步骤418,主线程通过调用回调函数将目标数据反馈给客户端。
153.本说明书提供的任务处理方法,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,所述主线程将待处理任务写入待处理任务队列;所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,可以认为第一待处理任务未被其他工作线程获取,不会出现被重复执行的情况,则所述目标工作线程可以删除所述第二待处理任务,并执行所述备份任务。本
说明书实施例中,两个或两个以上的工作线程可以并行从待处理任务队列中获取待处理任务,无需等待,可以降低游戏服务器资源的消耗,提高获取待处理队列中待处理任务的效率。并且,工作线程获取到备份任务后不会立即执行,而是在确定备份任务未被其他工作线程执行的情况下再执行,可以避免多个工作线程获取到同一个待处理任务,导致待处理任务被重复执行的情况,减少了服务器资源的浪费,提高了任务获取的安全性,进而提高了队列访问的安全性。
154.与上述方法实施例相对应,本说明书还提供了任务处理的装置实施例,图6示出了本说明书一实施例提供的一种获取数据的装置的结构示意图。如图6所示,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,该装置包括:
155.任务写入模块602,被配置为通过所述主线程将待处理任务写入待处理任务队列;
156.任务获取模块604,被配置为通过所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
157.任务执行模块606,被配置为在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,通过所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
158.可选地,所述任务获取模块604还被配置为:
159.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同的情况下,通过所述目标工作线程删除所述备份任务。
160.可选地,任务执行模块606被配置为:
161.将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程的目标工作线程对应的备份任务与所述待处理任务中所述目标位置处当前的第二待处理任务相同。
162.可选地,所述任务获取模块604被配置为:
163.将所述至少一个工作线程对应的备份任务分别与所述第二待处理任务做比对,若所述至少一个工作线程对应的备份任务中存在与所述第二待处理任务相同的目标备份任务,将所述目标备份任务对应的工作线程确定为所述目标工作线程,并确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务不同。
164.可选地,所述任务执行模块606被配置为:
165.通过所述目标工作线程基于所述备份任务对数据库中的数据进行处理,并将任务处理结果反馈给所述主线程。
166.可选地,所述任务执行模块606被配置为:
167.通过所述目标工作线程基于所述备份任务对所述数据库中的数据进行处理,并获取所述任务处理结果;
168.通过所述目标工作线程将所述任务处理结果写入结果反馈队列;
169.通过所述主线程从所述结果反馈队列中获取所述任务处理结果。
170.可选地,所述任务执行模块606被配置为:
171.所述待处理任务包括任务标识,则所述备份任务中包括所述任务标识,通过所述目标工作线程获取携带所述任务标识的所述任务处理结果。
172.可选地,所述任务执行模块606被配置为:
173.通过所述主线程基于所述任务标识从所述结果反馈队列中获取所述任务处理结果。
174.可选地,所述任务执行模块606被配置为:
175.若所述备份任务为数据获取任务,则所述任务处理结果为所述数据获取任务对应的目标数据,通过所述目标工作线程从所述数据库中获取所述数据获取任务对应的目标数据。
176.可选地,任务执行模块606被配置为:
177.若所述备份任务为数据查询任务,则所述任务处理结果为所述数据查询任务对应的数据查询结果,通过所述目标工作线程,在所述数据库中查询与所述数据查询任务对应的待查询数据,得到所述数据查询结果。
178.可选地,任务执行模块606被配置为:
179.若所述备份任务为数据更新任务,则所述任务处理结果为所述数据更新任务对应的更新数据,通过所述目标工作线程,对所述数据库中与所述数据更新任务对应的待更新数据进行更新,得到所述更新数据。
180.可选地,所述任务写入模块602还被配置为:
181.通过所述主线程接收所述待处理任务对应的回调函数。
182.可选地,所述任务执行模块606还被配置为:
183.所述待处理任务基于用户的操作生成并由客户端发送至所述服务器,通过所述主线程调用所述回调函数将所述任务处理结果发送至所述客户端。
184.本说明书提供的任务处理方法,应用于游戏服务器,所述游戏服务器创建主线程和至少两个工作线程,所述主线程将待处理任务写入待处理任务队列;所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,可以认为第一待处理任务未被其他工作线程获取,不会出现被重复执行的情况,则所述目标工作线程可以删除所述第二待处理任务,并执行所述备份任务。本说明书实施例中,两个或两个以上的工作线程可以并行从待处理任务队列中获取待处理任务,无需等待,可以降低游戏服务器资源的消耗,提高获取待处理队列中待处理任务的效率。并且,工作线程获取到备份任务后不会立即执行,而是在确定备份任务未被其他工作线程执行的情况下再执行,可以避免多个工作线程获取到同一个待处理任务,导致待处理任务被重复执行的情况,减少了服务器资源的浪费,提高了任务获取的安全性,进而提高了队列访问的安全性。
185.上述为本实施例的一种任务处理装置的示意性方案。需要说明的是,该任务处理装置的技术方案与上述的任务处理方法的技术方案属于同一构思,任务处理装置的技术方
案未详细描述的细节内容,均可以参见上述任务处理的方法的技术方案的描述。
186.图7示出了根据本说明书一实施例提供的一种计算设备700的结构框图。该计算设备700的部件包括但不限于存储器710和处理器720。处理器720与存储器710通过总线730相连接,数据库750用于保存数据。
187.计算设备700还包括接入设备740,接入设备740使得计算设备700能够经由一个或多个网络760通信。这些网络的示例包括公用交换电话网(pstn)、局域网(lan)、广域网(wan)、个域网(pan)或诸如因特网的通信网络的组合。接入设备740可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic))中的一个或多个,诸如ieee802.11无线局域网(wlan)无线接口、全球微波互联接入(wi

max)接口、以太网接口、通用串行总线(usb)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc)接口,等等。
188.在本说明书的一个实施例中,计算设备700的上述部件以及图7中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图7所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
189.计算设备700可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备700还可以是移动式或静止式的服务器。
190.其中,处理器720用于执行如下计算机可执行指令:
191.所述主线程将待处理任务写入待处理任务队列;
192.所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
193.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
194.上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的任务处理方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述任务处理方法的技术方案的描述。
195.本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于:
196.所述主线程将待处理任务写入待处理任务队列;
197.所述至少两个工作线程中的至少一个工作线程从所述待处理任务队列中获取目标位置处的第一待处理任务并备份,得到所述至少一个工作线程对应的备份任务;
198.在确定所述至少一个工作线程中的目标工作线程对应的备份任务与所述待处理任务队列中所述目标位置处当前的第二待处理任务相同的情况下,所述目标工作线程删除所述第二待处理任务,并执行所述备份任务。
199.上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的任务处理方法的技术方案属于同一构思,存储介质的技术方案
未详细描述的细节内容,均可以参见上述任务处理方法的技术方案的描述。
200.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
201.所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read

only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
202.需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书并不受所描述的动作顺序的限制,因为依据本说明书,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书所必须的。
203.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
204.以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1