掌桥专利:专业的专利平台
掌桥专利
首页

分布式编译方法及系统、节点、计算机可读存储介质

文献发布时间:2024-04-18 19:58:21


分布式编译方法及系统、节点、计算机可读存储介质

技术领域

本申请涉及分布式编译的技术领域,尤其涉及分布式编译方法、分布式编译系统、节点、计算机可读存储介质及计算机程序产品。

背景技术

随着软件功能和复杂度的增加,软件规模越来越庞大,软件开发者花费在软件编译上的时间也越来越长。以编译Android开源项目为例,Android 12版本的源代码大小约为94GB,完整编译该项目在一台16核心32GB内存的机器上需要约87分钟。过长的编译时间会降低测试和部署速度,增加开发周期,从而增加项目开发成本。因此,为了提高开发效率和降低开发成本,需要缩短软件项目的编译时间,例如可以采用分布式编译技术。

然而,类似于Android开源项目这种大型项目,一方面它的代码量巨大,另一方面,有超过一千条编译规则(Rule),而且是多语言的项目,想要实现完全的分布式编译,所有命令都能借助远程编译节点来执行,非常困难。

基于此,本申请提供了分布式编译方法、分布式编译系统、节点、计算机可读存储介质及计算机程序产品,以改进相关技术。

发明内容

本申请的目的在于提供分布式编译方法、分布式编译系统、节点、计算机可读存储介质及计算机程序产品,通过多个节点之间的共享计算实现分布式编译,提高编译效率,缩短编译时间。

本申请的目的采用以下技术方案实现:

第一方面,本申请提供了一种分布式编译方法,应用于调度节点,所述调度节点为多个节点的其中一个,所述方法包括:

接收每个需求节点发送的多条编译命令,每个需求节点为多个节点的其中一个;

分配每条编译命令对应的一个或多个执行节点,以使每个执行节点获取并执行自身对应的一条或多条编译命令,每个执行节点为多个节点的其中一个。

该技术方案的有益效果在于:通过多个节点之间的共享计算实现分布式编译,即,将本节点的编译命令发送到调度中心(即调度节点),其他节点根据自身计算负载取编译命令并执行。调度节点充当调度中心这一角色,其余节点可以充当两种角色,即编译角色和执行角色。当其中一个或多个节点有编译任务时,这些节点作为需求节点,充当编译角色。每个需求节点可以向调度节点发送编译请求和多条编译命令。调度节点接收到每个需求节点发送的多条编译命令后,会为每条编译命令分配对应的一个或多个执行节点。每个执行节点获取并执行自身对应的一条或多条编译命令,此时这些执行节点充当执行角色。当执行节点执行完编译命令后得到编译结果,将编译结果发送至对应的需求节点。

具体而言,每个需求节点将多条编译命令发送到调度节点。调度节点接收到需求节点发送的编译命令后,为每条编译命令分配一个或多个执行节点。每个执行节点获取并执行自身对应的一条或多条编译命令。执行节点完成编译任务后,将编译结果发送给对应的需求节点。

这样做的好处是,通过将编译任务分发到多个节点上进行并行处理,实现了分布式编译,这样可以利用多个节点的计算资源来加速编译过程,提高编译效率和速度,缩短编译时间;通过多个节点之间的共享计算,将编译命令发送到调度节点,并由其他节点根据自身计算负载来获取并执行编译命令,这样可以更好地利用整个系统的计算资源,提高资源利用率;调度节点充当调度中心的角色,负责接收和分配编译命令,需求节点可以充当编译角色,向调度节点发送编译请求和编译命令,执行节点充当执行角色,获取并执行编译命令,这种角色分工使得编译任务在系统中得以有效地协同进行;执行节点在完成编译任务后,将编译结果发送给对应的需求节点,这样,需求节点可以获得编译结果并进行后续处理,实现了任务的完整性和结果的反馈。总体而言,这种分布式编译方法通过分发编译任务到多个节点上进行并行处理,充分利用系统中的计算资源,提高编译效率和速度,同时,角色分工和结果反馈机制确保了任务的协同完成和结果的准确传递。

在一些可能的实现方式中,所述分配每条编译命令对应的一个或多个执行节点,包括:

获取注册至所述调度节点的每个节点的当前状态信息;

根据每个节点的当前状态信息,更新可用节点列表;

使用负载均衡算法,从所述可用节点列表中确定每条编译命令对应的一个或多个执行节点。

该技术方案的有益效果在于:调度节点获取注册到其上的每个节点的当前状态信息。当前状态信息可以包括节点的负载情况、可用性、性能指标等。根据每个节点的当前状态信息,调度节点会更新可用节点列表。该可用节点列表记录了系统中可用于执行编译任务的节点。调度节点会使用负载均衡算法从可用节点列表中选择一个或多个节点,来为每条编译命令分配对应的执行节点。负载均衡算法可以根据节点的负载情况、性能指标等因素,使任务尽可能地均匀地分配给各个节点。

这样做的好处是,通过获取节点的当前状态信息并更新可用节点列表,系统可以动态地感知节点的可用性和负载情况,这样,可以在分配编译任务时,选择性地将任务分配给空闲节点或负载较低的节点,以充分利用系统资源,提高整体的编译效率;使用负载均衡算法选择执行节点,可以确保编译任务在各个节点上均匀分布,这样可以避免某些节点负载过重,而其他节点处于空闲状态的情况,从而提高系统的整体性能和效率;由于节点的当前状态信息是动态获取和更新的,系统可以根据节点的实际情况进行自适应调整,并且,当节点状态发生变化时,例如节点负载增加或减少,系统可以及时更新可用节点列表,并根据负载均衡算法重新分配编译任务,以适应系统的变化和优化编译效果。综上所述,通过获取节点状态信息、更新可用节点列表和使用负载均衡算法,系统可以实现动态节点分配和负载均衡,以提高分布式编译系统的效率和性能,该方法可以根据实际情况进行自适应调整,确保编译任务在各个节点上均匀分布,并充分利用系统资源。

在一些可能的实现方式中,每个需求节点通过NFS协议设置自身对应的共享目录;

所述方法还包括:

在分配所有编译命令对应的执行节点后,通知所有分配到的执行节点执行挂载命令,以使所有分配到的执行节点挂载至对应的共享目录;

在接收到所有需求节点发送的编译结束通知信息后,通知所有分配到的执行节点执行取消挂载命令。

该技术方案的有益效果在于:通过多个节点之间的共享目录+共享计算实现分布式编译。例如可以通过NFS(Network File System)协议设置共享目录,将每个需求节点的项目目录作为共享目录,自动挂载到相应的执行节点上,执行节点在执行编译命令时通过共享目录进行文件读写,这样就形成了目录访问和计算资源共享的P2P网络,其中调度节点作为调度中心,协调和管理各个执行节点的任务分配和执行。

具体而言,每个需求节点通过NFS协议设置自身对应的共享目录。NFS是一种分布式文件系统协议,允许不同节点之间通过网络访问和共享文件。在分配所有编译命令对应的执行节点后,调度节点会通知所有执行节点执行挂载命令。这些执行节点会根据自身分配到的编译命令,将自身挂载到对应的一个或多个共享目录上,以便在执行编译任务时可以访问和使用共享目录中的文件和资源。执行节点在挂载共享目录后,开始执行分配到它们的编译命令。此时执行节点可以通过共享目录访问所需的文件和资源,并执行相应的编译操作。在接收到所有需求节点发送的编译结束通知信息后,调度节点会通知所有执行节点执行取消挂载命令。执行节点会将其挂载到共享目录的连接断开,释放资源并结束任务。

这样做的好处是,通过使用NFS协议设置共享目录,不同节点之间可以共享文件和资源,这样,编译任务所需的文件和资源可以存储在共享目录中,供执行节点访问和使用,提高编译的效率和一致性;执行节点通过挂载共享目录,可以直接访问共享目录中的文件和资源,而无需通过网络传输,这减少了数据传输的延迟和网络带宽的负担,提高了访问和传输的效率;在任务开始前,执行节点动态挂载共享目录,使其与任务相关的文件和资源可用,任务完成后,执行节点取消挂载,释放资源,这种动态挂载和取消挂载的机制确保了资源的有效利用和及时释放,提高系统的灵活性和资源管理效果。综上所述,通过使用NFS协议设置共享目录、执行节点的挂载和取消挂载操作,系统可以实现共享文件和资源、高效访问和传输的效果,该方法简化了编译任务所需的文件和资源管理,并提高了分布式编译系统的效率和灵活性。

在一些可能的实现方式中,所述方法还包括:

将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;

将每条编译命令的命令标识发送至对应的执行节点,以使每个执行节点从redis数据库中查询自身对应的编译命令的执行状态;

针对每条编译命令执行以下处理:在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将redis数据库中所述编译命令的执行状态设置为已执行,并在redis数据库中删除所述编译命令。

该技术方案的有益效果在于:将每条编译命令放入redis数据库,并将每条编译命令的执行状态设置为待执行。redis是一个内存数据库,可以高效地进行读写操作和状态管理。将每条编译命令的标识发送至对应的执行节点,使得每个执行节点可以从redis数据库中查询自身对应的编译命令的执行状态。执行节点通过查询执行状态来确定自己是否需要执行一条编译命令。在需求节点接收到编译命令的编译结果后,调度节点进行以下处理:将redis数据库中对应编译命令的执行状态设置为已执行,并从redis数据库中删除该编译命令。这样可以标记该编译命令已经执行完毕并清除相关的命令信息。

这样做的好处是,通过将编译命令存储在redis数据库中并设置执行状态,可以集中管理编译命令,并记录每条编译命令的执行状态,通过有效地管理和追踪每条编译命令的执行状态,可以避免命令丢失或混乱,并提供了对编译任务整体进度的掌控能力;将编译命令的标识发送至对应的执行节点,实现了分布式任务调度,每个执行节点可以根据编译命令的命令标识从redis数据库中查询待执行的编译命令,并执行相应的任务,这种分布式任务调度可以充分利用系统中的多个节点,并实现并行处理和资源的高效利用;当需求节点接收到编译结果后,更新redis数据库中对应编译命令的状态为已执行,并删除该编译命令,这样可以及时更新任务状态,并清理不再需要的命令信息,避免数据库冗余和资源浪费。综上所述,通过将编译命令存储在redis数据库中,并设置执行状态,以及通过发送命令标识和查询执行状态的方式实现任务调度和结果处理,该方法能够有效地管理编译命令和状态,实现分布式任务调度和并行处理,提高编译系统的效率和资源利用率。同时,及时更新执行状态和清理不需要的命令信息,保持数据库的整洁性和高效性。

第二方面,本申请提供了一种分布式编译系统,所述系统包括至少一个需求节点、调度节点和至少一个执行节点;

每个需求节点用于向所述调度节点发送多条编译命令;

所述调度节点用于分配每条编译命令对应的一个或多个执行节点;

每个执行节点用于获取并执行自身对应的一条或多条编译指令以得到一个或多个编译结果,并将每个编译结果分别发送至对应的需求节点。

该技术方案的有益效果在于:该分布式编译系统包括至少一个需求节点、调度节点和至少一个执行节点。需求节点用于向调度节点发送多条编译命令。调度节点负责分配每条编译命令对应的一个或多个执行节点。执行节点获取并执行自身对应的一条或多条编译命令,并生成一个或多个编译结果。最后,执行节点将每个编译结果分别发送给对应的需求节点。

这样做的好处是,通过将编译任务分发到不同的节点上,系统实现了分布式任务调度,需求节点发送编译命令到调度节点,调度节点根据任务负载和资源可用性,将编译命令分配给合适的执行节点,这种分布式任务调度机制充分利用了系统中的多个节点,提高了编译任务的并行性和整体效率;每个执行节点获取并执行自身对应的一条或多条编译命令,这使得多个编译任务可以在不同的节点上同时进行,实现并行执行,通过利用多个执行节点的计算资源,系统能够更高效地利用系统资源,加速编译过程,提高编译效率和速度;执行节点在完成编译任务后,将每个编译结果分别发送至对应的需求节点,这种结果反馈和通信机制确保了编译结果的准确传递和任务的完整性,需求节点可以根据接收到的编译结果进行后续处理,如错误检测、构建输出等。综上所述,该分布式编译系统通过分布式任务调度、并行执行和结果反馈机制,实现了高效的分布式编译,这种系统架构利用多个节点的计算资源,提高编译效率和速度。同时,通过结果反馈和通信机制,保证编译结果的正确传递和任务的完整性。

在一些可能的实现方式中,所述调度节点还用于将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;以及,将每条编译命令的命令标识发送至对应的执行节点;

每个执行节点用于根据接收到的一个或多个命令标识,从redis数据库中查询每个命令标识对应的编译命令的执行状态,从redis数据库中读取其中一条或多条编译命令并执行;

所述调度节点还用于针对每条编译命令,在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将所述编译命令的执行状态设置为已执行,并在redis数据库中删除对应的编译命令。

该技术方案的有益效果在于:调度节点将每条编译命令放入redis数据库,并将每条编译命令的执行状态设置为待执行。redis数据库用于存储编译命令和相应的状态信息。调度节点将每条编译命令的命令标识发送至对应的执行节点。执行节点根据接收到的一个或多个命令标识,从redis数据库中查询每个命令标识对应的编译命令的执行状态,并读取其中一条或多条编译命令进行执行。在发出编译命令的需求节点接收到编译命令的编译结果后,调度节点对该编译命令进行以下处理:将编译命令的执行状态设置为已执行,并在redis数据库中删除对应的编译命令。

这样做的好处是,通过将编译命令和状态信息存储在redis数据库中,调度节点可以有效地管理和追踪编译命令的执行状态,这样可以确保任务的顺序执行和状态的准确管理;调度节点根据需求节点发送的编译命令,将命令标识分发给相应的执行节点,执行节点根据命令标识从redis数据库中查询并执行编译命令,这种动态分发和执行机制使得编译任务可以根据系统负载和资源情况进行动态调整,提高系统的灵活性和任务处理效率;调度节点在需求节点接收到编译结果后,更新对应编译命令的状态为已执行,并从redis数据库中删除该编译命令,这种结果反馈和清理机制保证了任务状态的同步和数据库的清理,确保系统的一致性和可靠性。综上所述,通过使用redis数据库管理编译命令和状态信息,并实现编译命令的分发、执行结果的反馈和清理,系统能够实现分布式编译任务的管理和控制,该方法提高了任务的顺序执行和状态追踪的能力,同时保证了系统的可靠性和一致性。

在一些可能的实现方式中,每个执行节点采用以下方式执行自身对应的编译命令:

将接收到的一个或多个命令标识放入自身对应的待执行队列中;

当所述待执行队列非空时,检测自身负载是否过重;

当自身负载非过重时,从所述待执行队列中取出一个命令标识;

根据取出的命令标识,从redis数据库中查询所述命令标识对应的编译命令的执行状态;

如果是待执行,则将其设置为执行中,并从redis数据库中读取所述命令标识对应的编译命令并执行;

如果非待执行,则检测所述待执行队列是否全部执行完成;如果否,则从所述待执行队列中取出下一个命令标识。

该技术方案的有益效果在于:每个执行节点将接收到的一个或多个命令标识放入自身对应的待执行队列中。待执行队列用于存储等待执行的命令标识。当待执行队列非空时,执行节点会检测自身的负载情况。如果负载非过重,执行节点从待执行队列中取出一个命令标识,并进行下一步操作;如果负载过重,则暂时不执行任务,等待负载减轻后再继续任务调度。根据取出的命令标识,执行节点从redis数据库中查询命令标识对应的编译命令的执行状态。如果执行状态是待执行,则将其设置为执行中,并从redis数据库中读取该命令标识对应的编译命令进行执行。如果执行状态非待执行,执行节点会检测待执行队列是否全部执行完成。如果还有待执行任务,则从待执行队列中取出下一个命令标识,重复上述步骤;如果所有任务都已执行完成,则等待进一步的任务调度。

这样做的好处是,执行节点根据自身负载情况来决定是否执行任务,通过检测待执行队列和负载情况,可以避免执行节点过载和资源浪费;每个执行节点的待执行队列存储了等待执行的命令标识,多个执行节点可以并行地执行多个编译命令,同时,通过查询执行状态和执行判断,保证任务的顺序性和执行状态的一致性;待执行队列管理了任务的顺序和调度,通过检测队列状态和任务执行情况,每个执行节点可以灵活地管理自己的待执行队列,选择是否执行编译命令,以适应系统的动态变化和任务处理的灵活性。综上所述,通过使用待执行队列、负载检测和执行状态查询等机制,系统实现了分布式编译任务的并行执行和任务调度。该方法能够实现负载均衡、任务顺序性和任务调度的灵活性,提高分布式编译系统的效率和性能。

在一些可能的实现方式中,所述调度节点还用于在编译过程中,周期性地向每个执行节点发送健康检查命令;

每个执行节点还用于在接收到所述健康检查命令后返回节点信息;

所述调度节点还用于当一个周期内至少一个执行节点未返回节点信息时,将未返回节点信息的至少一个执行节点对应的至少一条编译命令重新分配给其他节点,并将重新分配的编译命令的命令标识发送至重新分配的对应节点。

该技术方案的有益效果在于:调度节点在编译过程中周期性地向每个执行节点发送健康检查命令。这些健康检查命令用于检测执行节点的状态和可用性。每个执行节点在接收到健康检查命令后,返回节点信息给调度节点。节点信息可以包括节点的可用性、负载情况、性能指标等。在一个周期内,如果至少一个执行节点未返回节点信息,说明该执行节点可能出现故障或不可用。调度节点会将未返回节点信息的至少一个执行节点对应的至少一条编译命令重新分配给其他节点。调度节点将重新分配的编译命令的命令标识发送至重新分配的对应节点,以通知其执行重新分配的编译任务。

这样做的好处是,通过周期性地发送健康检查命令并接收节点信息,调度节点可以实时监测执行节点的健康状态,这有助于及时发现故障节点或不可用节点,提高系统的可靠性和稳定性;如果一个执行节点未返回节点信息,调度节点会重新分配该节点的编译命令给其他节点,这种故障节点的处理机制可以避免任务被阻塞和延迟,确保编译任务的顺利执行和系统的稳定性;通过重新分配编译命令和命令标识的发送,调度节点可以动态管理节点和任务的分配,当节点出现故障或不可用时,调度节点能够灵活地重新分配任务给其他可用节点,以保证任务的高效执行和资源的充分利用。综上所述,通过周期性的健康检查命令、节点信息的返回和重新分配编译命令的机制,系统可以实现对执行节点健康状态的监测、故障节点的处理和动态节点管理,该方法提高了系统的可靠性、稳定性和任务的执行效率,确保编译任务能够在分布式环境下顺利完成。

第三方面,本申请提供了一种节点,所述节点包括存储器和至少一个处理器,所述存储器存储有计算机程序,所述至少一个处理器被配置成执行所述计算机程序时实现以下步骤:

当所述节点作为需求节点时,向调度节点发送多条编译命令;

当所述节点作为调度节点时,分配每条编译命令对应的一个或多个执行节点;

当所述节点作为执行节点时,获取并执行自身对应的一条或多条编译指令以得到一个或多个编译结果,并将每个编译结果分别发送至对应的需求节点。

该技术方案的有益效果在于:针对每个节点,当节点作为需求节点时,可以向调度节点发送多条编译命令。需求节点负责发起编译任务,将编译命令发送给调度节点进行处理。当节点作为调度节点时,可以分配每条编译命令对应的一个或多个执行节点。调度节点负责任务的调度和分配,将编译命令分发给适合执行的节点。当节点作为执行节点时,可以获取并执行自身对应的一条或多条编译指令,生成一个或多个编译结果,然后将每个编译结果分别发送至对应的需求节点。

这样做的好处是,通过将不同的节点配置为需求节点、调度节点和执行节点,系统实现了分布式任务处理,这样可以将编译任务分布到不同的节点上,充分利用系统资源,提高编译任务的并行处理能力和整体效率;同一个节点可以在不同的时刻充当不同的角色,根据任务需求进行切换,这种灵活的节点角色切换机制使得系统可以根据实际情况进行任务分配和处理,提高系统的灵活性和适应性;其中,需求节点自身可以作为执行节点之一,即该需求节点同时充当编译角色和执行角色,如有必要,调度节点也可以这样,即调度节点也可以作为执行节点之一,同时充当调度角色和执行角色;执行节点生成的编译结果会被发送至对应的需求节点,以完成任务的协作和结果的传递,这种结果通信机制保证了编译结果的准确性和及时性,使得系统能够有效地进行任务协同和结果整合。综上所述,根据实际应用中的需要,通过将节点配置为需求节点、调度节点和执行节点,系统实现了分布式任务处理和节点角色切换,该方法能够充分利用系统资源,提高编译任务的并行处理能力和整体效率。同时,通过结果通信和协作机制,保证了任务的协同和结果的准确传递,提高系统的可靠性和完成度。

第四方面,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被至少一个处理器执行时实现上述任一项方法的步骤,或者实现上述任一项分布式编译系统的功能,或者实现上述任一项节点的功能。

第五方面,本申请提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被至少一个处理器执行时实现上述任一项方法的步骤,或者实现上述任一项分布式编译系统的功能,或者实现上述任一项节点的功能。

附图说明

下面结合说明书附图和具体实施方式进一步说明本申请。

图1是本申请实施例提供的一种分布式编译方法的流程示意图。

图2是本申请实施例提供的一种客户端程序ninja的流程图。

图3是本申请实施例提供的一种服务端程序scheduler的流程图。

图4是本申请实施例提供的一种执行端程序executor的流程图。

图5是本申请实施例提供的一种各个组件的工作时序图。

图6是本申请实施例提供的一种分布式编译系统的部署图。

图7是本申请实施例提供的一种节点的结构框图。

图8是本申请实施例提供的一种计算机程序产品的结构示意图。

具体实施方式

下面将结合本申请的说明书附图以及具体实施方式,对本申请中的技术方案进行描述,需要说明的是,在不相冲突的前提下,以下描述的各实施方式之间或各技术特征之间可以任意组合形成新的实施方式。

本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施方式或设计方案不应被解释为比其他实施方式或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。

本申请实施例中出现的第一、第二等描述,仅作示意与区分描述对象之用,没有次序之分,也不表示本申请实施例中对数量的特别限定,不能构成对本申请实施例的任何限制。

下面对本申请实施例的技术领域和相关术语进行简单说明。

随着软件功能和复杂度的增加,软件规模越来越庞大,软件开发者花费在软件编译上的时间也越来越长。以编译Android开源项目为例,Android 12版本的源代码大小约为94GB,完整编译该项目在一台16核心32GB内存的机器上需要约87分钟。过长的编译时间会降低测试和部署速度,增加开发周期,从而增加项目开发成本。因此,为了提高开发效率和降低开发成本,需要缩短软件项目的编译时间。

为了解决这一问题,相关解决方案是使用分布式编译系统,其基本原理是:用户在执行编译指令后,用户程序会解析出一条条的编译命令,然后将输入文件和编译命令一起发往远程编译节点,在远程编译节点上执行完成后,再将输出文件通过网络返回到用户机器上。用户机器再更新下一条编译命令和输入文件,循坏往复,直到所有编译命令都执行完毕,并且得到了最终的编译产物为止。

然而,这种架构需要明确知道每条编译命令的输入文件有哪些,例如“g++-o foofoo.cc”这条命令未指定foo.h这个必须要输入的头文件,就可能会导致用户程序未将foo.h也作为输入文件发给远程编译节点,进而导致编译命令执行时由于缺少输入文件而执行失败。

目前最常见的解决方案有两种,一种是通过用户编辑的工程文件来明确指定所有的输入文件,另一种是将分布式编译系统设计成仅支持特定种类编译命令的远程执行,分别以开源编译工具Bazel和Yadcc为代表。在设计编译工具Bazel时加入了BUILD工程文件,用户通过编辑BUILD工程文件的内容来指定每条编译命令所依赖的所有输入文件,这样就可以确保所有输入文件都发往了远程编译节点。Yadcc被设计成仅支持C/C++语言的分布式编译,而没有解决其他语言编译的远程执行问题。

然而,类似于Android开源项目这种大型项目。一方面它的代码量巨大,如果要适配Bazel需要用户编辑BUILD文件,为每一条编译命令手动指定输入文件,Android开源项目共有超过十万条命令,因此适配工作复杂且繁琐。另一方面,Android开源项目有超过一千条编译规则(Rule),而且是多语言的项目,想要实现完全的分布式编译,所有命令都能借助远程编译节点来执行,非常困难。

基于此,本申请提供了分布式编译方法、分布式编译系统、节点、计算机可读存储介质及计算机程序产品,以改进相关技术。具体而言,本申请用于实现几乎完全负载均衡的分布式编译,将几乎所有的编译命令都可以放到远程编译节点执行,并且自动获取输入文件,不需要用户编写繁琐复杂的工程配置文件来指明每一条编译命令的输入文件。相对于仅仅支持C/C++或者其他特定编程语言的分布式编译系统,本申请可以支持几乎所有语言的分布式编译;相对于需要用户手动编写工程文件来指定所有输入文件的分布式编译系统,本申请可以直接使用ninja的工程文件或者由Cmake等其他工具生成ninja工程文件,而无需用户编写。

本申请实施例提供的方案涉及分布式编译等技术,具体通过下文中的实施例进行说明。需要说明的是,以下实施例的描述顺序不作为对实施例优选顺序的限定。

NFS(Network File System)是一种用于在计算机网络上共享文件系统的协议。它允许一个计算机系统上的客户端访问另一个计算机系统上的远程文件,就像访问本地文件一样。在使用NFS进行文件共享时,多个节点之间可以通过以下步骤实现文件的共享:

1、设置NFS服务器:选择一个节点作为NFS服务器。在该节点上,需要安装和配置NFS服务端软件。

2、配置共享目录:选择要共享的目录或文件系统,并在NFS服务器上进行配置。例如在NFS服务器的配置文件中指定共享的目录路径、访问权限和其他选项。

3、启动NFS服务:在NFS服务器上启动NFS服务,以便监听来自客户端的请求。

4、配置NFS客户端:在需要访问共享文件的节点上,配置NFS客户端。例如安装NFS客户端软件并设置相应的配置。

5、挂载共享目录:在NFS客户端上,使用挂载命令将NFS服务器上的共享目录挂载到本地节点的指定目录。挂载命令指定NFS服务器的地址和共享目录的路径,以及本地节点的挂载点路径。

6、访问共享文件:一旦共享目录被成功挂载,NFS客户端可以像访问本地文件一样,通过本地挂载点路径来访问共享文件。对共享文件的读取、写入或其他操作将通过NFS协议传递到NFS服务器,然后在NFS服务器上执行相应的操作。

为了进行文件共享,NFS服务器和NFS客户端之间需要建立网络连接,并确保在网络上能够相互通信。此外,对于安全性和访问权限的考虑,可以在NFS配置中设置适当的权限和身份验证机制。通过上述步骤,多个节点可以通过NFS实现文件的共享。NFS允许节点之间透明地访问和操作共享文件,使得文件在不同节点间的共享和协作变得更加便捷。

(分布式编译方法)

参见图1至图6,图1是本申请实施例提供的一种分布式编译方法的流程示意图,图2是本申请实施例提供的一种客户端程序ninja的流程图,图3是本申请实施例提供的一种服务端程序scheduler的流程图,图4是本申请实施例提供的一种执行端程序executor的流程图,图5是本申请实施例提供的一种各个组件的工作时序图,图6是本申请实施例提供的一种分布式编译系统的部署图。

本申请实施例提供了一种分布式编译方法,应用于调度节点,所述调度节点为多个节点的其中一个,所述方法包括:

步骤S101:接收每个需求节点发送的多条编译命令,每个需求节点为多个节点的其中一个;

步骤S102:分配每条编译命令对应的一个或多个执行节点,以使每个执行节点获取并执行自身对应的一条或多条编译命令,每个执行节点为多个节点的其中一个。

分布式编译方法是一种编译任务在多个节点上分布和并行执行的方法,通过将编译任务划分为多个子任务(例如是多条编译指令)并分配给不同的执行节点,以提高编译任务的效率和加速编译过程。

调度节点是负责协调和管理编译任务的节点。它接收需求节点发送的编译命令,并根据任务调度算法(例如是负载均衡算法或者负载均衡模型)将编译命令分配给相应的执行节点,以实现任务的并行执行和资源的合理利用。

需求节点是有编译需求的节点,将编译命令发送给调度节点,并等待执行节点返回编译结果。在一些实施例中,需求节点自身也分配一条或多条编译命令,执行所分配到的编译命令中的部分或者全部。

编译命令是指导编译任务执行的指令或命令。它包含编译任务的具体要求、输入(例如是输入文件)和参数信息等,用于告知执行节点如何进行编译操作。

执行节点是负责执行编译任务的节点之一。执行节点接收调度节点分配的编译命令,根据编译命令中的指令和参数执行编译操作,并生成编译结果。

在一些实施例中,编译命令由调度节点转发给执行节点,这种转发可以是直接转发,也可以通过中间设备转发。其中,中间设备例如可以采用redis数据库或者消息队列服务器。

例如,可以使用redis数据库来存储和转发编译命令。当调度节点需要将编译命令发送给执行节点时,可以将编译命令存储到redis数据库中。然后,执行节点可以从redis数据库中获取编译命令。

另外,也可以使用消息队列服务器来实现转发功能。当调度节点需要将编译命令发送给执行节点时,可以将编译命令发送到消息队列服务器中。然后,执行节点可以从消息队列服务器中获取编译命令。

作为一个示例,本实施例是一种用于30人以下的小型团队提高编译速度的解决方案,内网部署。内网中有一台机器作为服务端(调度节点),用于存储和转发编译命令。每个用户的机器(调度节点以外的其他节点)既是自己的客户端(需求节点),又是系统的其中一个远程编译节点。当一个用户执行编译任务的时候,可以使用到系统中所有机器的算力来加快编译速度。

需求节点在发起一次编译任务时,首先向调度节点发送本机的内网ip、编译工具ninja的工作目录和项目根目录,调度节点返回测试成功或者失败的信号。需求节点例如可以安装有客户端程序ninja,调度节点例如可以安装有服务端程序scheduler,执行节点例如是远程编译节点,执行节点可以安装有执行端程序executor。

客户端程序ninja将解析出的编译命令发往服务端程序scheduler,例如包含该编译命令的命令id(即命令标识)、客户端ip、命令内容、是否指定本机节点(即该需求节点自身)执行以及命令执行目录。

服务端程序scheduler将命令id转发给执行节点。

执行端程序executor根据命令id找到编译命令的详细内容和状态,将编译命令执行完毕后返回执行结果信息,包含命令是否执行成功、命令id、命令是由哪台机器(执行端程序executor)执行的、命令重试了几次(可选)以及命令执行中的标准输出和标准错误。

服务端程序scheduler向客户端程序ninja返回执行结果信息,例如包含命令是否执行成功、命令id、命令是由哪台机器执行的、命令重试了几次(可选)以及命令执行中的标准输出和标准错误。

客户端程序ninja的编译命令全部执行完毕后,通知服务端程序scheduler编译结束。客户端程序ninja向服务端程序scheduler发送本机内网ip、ninja工作目录和项目根目录。

在所有需求节点的客户端程序ninja都发送编译结束通知信息后,服务端程序scheduler通知所有远程编译节点的执行端程序executor取消挂载。

执行端程序executor将返回是否取消挂载成功。

在本实施例中,执行端程序executor的编译结果和/或执行结果信息可以通过服务端程序scheduler转发给客户端程序ninja。或者,执行端程序executor的编译结果和/或执行结果信息也可以直接发送给客户端程序ninja,此时,执行端程序executor的编译结果和/或执行结果信息可以通过NFS协议直接写入该客户端程序ninja对应的共享目录(例如是ninja的工作目录和项目根目录)。或者,执行端程序executor的编译结果可以通过NFS协议写入客户端程序ninja对应的共享目录,执行端程序executor的执行结果信息可以通过服务端程序scheduler转发给客户端程序ninja。或者,执行端程序executor的编译结果可以通过服务端程序scheduler转发给客户端程序ninja,执行端程序executor的执行结果信息可以通过NFS协议写入客户端程序ninja对应的共享目录。

在一些实施例中,编译命令由执行节点从调度节点处主动获取。可以在执行节点上设置一个定时器或者轮询机制,以确保及时获取到最新的编译命令。例如,可以使用Cron表达式来设置定时器,让执行节点每隔一段时间就向调度节点发送一个心跳包,以表明它仍然在线并可以接收新的编译命令。如果调度节点在一定时间内没有收到心跳包,则会认为执行节点已经失效,并将新的编译命令发送给其他可用的执行节点。另外,也可以使用消息队列服务器来实现主动获取编译命令的功能。当执行节点启动时,从消息队列服务器中订阅最新的编译命令,并开始执行任务。如果消息队列服务器中没有新的编译命令,则执行节点可以等待一段时间后再次尝试获取。

举例来说,假设有一个分布式编译系统,包括多个节点。其中,调度节点用于接收来自两个需求节点X和Y的五条编译命令。这些编译命令的命令标识为001、002、003、004和005,其中001-002是需求节点X发送的编译命令,003-005是需求节点Y发送的编译命令。

调度节点根据任务调度算法(例如是负载均衡算法),将编译命令001-005分配给可用的执行节点A、B和C。具体执行情况如下:

执行节点A执行编译命令001,生成编译结果A001;

执行节点B执行编译命令002和003,生成编译结果B002和B003;

执行节点C执行编译命令004和005,生成编译结果C004和C005。

最后,执行节点A、B、C将编译结果发送给对应的需求节点:

执行节点A将编译结果A001发送给需求节点X;

执行节点B将编译结果B002发送给需求节点X;

执行节点B将编译结果B003发送给需求节点Y;

执行节点C将编译结果C004发送给需求节点Y;

执行节点C将编译结果C005发送给需求节点Y。

在本实施例中,调度节点作为任务分配者,将编译命令分配给可用的执行节点。每个执行节点根据自身对应的编译命令执行任务并生成相应的编译结果。最后,编译结果通过节点间的通信发送给对应的需求节点,完成了分布式编译任务的执行和结果的返回。

由此,通过多个节点之间的共享计算实现分布式编译,即,将本节点的编译命令发送到调度中心(即调度节点),其他节点根据自身计算负载取编译命令并执行。调度节点充当调度中心这一角色,其余节点可以充当两种角色,即编译角色和执行角色。当其中一个或多个节点有编译任务时,这些节点作为需求节点,充当编译角色。每个需求节点可以向调度节点发送编译请求和多条编译命令。调度节点接收到每个需求节点发送的多条编译命令后,会为每条编译命令分配对应的一个或多个执行节点。每个执行节点获取并执行自身对应的一条或多条编译命令,此时这些执行节点充当执行角色。当执行节点执行完编译命令后得到编译结果,将编译结果发送至对应的需求节点。

具体而言,每个需求节点将多条编译命令发送到调度节点。调度节点接收到需求节点发送的编译命令后,为每条编译命令分配一个或多个执行节点。每个执行节点获取并执行自身对应的一条或多条编译命令。执行节点完成编译任务后,将编译结果发送给对应的需求节点。

这样做的好处是,通过将编译任务分发到多个节点上进行并行处理,实现了分布式编译,这样可以利用多个节点的计算资源来加速编译过程,提高编译效率和速度,缩短编译时间;通过多个节点之间的共享计算,将编译命令发送到调度节点,并由其他节点根据自身计算负载来获取并执行编译命令,这样可以更好地利用整个系统的计算资源,提高资源利用率;调度节点充当调度中心的角色,负责接收和分配编译命令,需求节点可以充当编译角色,向调度节点发送编译请求和编译命令,执行节点充当执行角色,获取并执行编译命令,这种角色分工使得编译任务在系统中得以有效地协同进行;执行节点在完成编译任务后,将编译结果发送给对应的需求节点,这样,需求节点可以获得编译结果并进行后续处理,实现了任务的完整性和结果的反馈。总体而言,这种分布式编译方法通过分发编译任务到多个节点上进行并行处理,充分利用系统中的计算资源,提高编译效率和速度,同时,角色分工和结果反馈机制确保了任务的协同完成和结果的准确传递。

在一些实施例中,所述分配每条编译命令对应的一个或多个执行节点(即步骤S102),包括:

获取注册至所述调度节点的每个节点的当前状态信息;

根据每个节点的当前状态信息,更新可用节点列表;

使用负载均衡算法,从所述可用节点列表中确定每条编译命令对应的一个或多个执行节点。

在分布式编译中,调度节点可以根据一定的策略和算法(例如是负载均衡算法),将编译任务分配给可用的执行节点,以实现任务的并行处理和负载均衡。

注册指将节点的信息和状态注册到调度节点的过程。执行节点将自身的状态信息(如可用性、负载情况等)注册到调度节点,以便调度节点在任务分配时考虑节点的状态。作为示例,在其他节点启动时必须向调度中心(即调度节点)注册自己的信息,作为之后调度中心任务下发的重要依据。例如,在向调度中心注册时,节点发送本机的核数、内网ip和接收端口,调度中心返回注册成功或者失败的信号。

当前状态信息指节点在某个时间点的状态情况,如节点的可用性、负载情况、性能指标等。

可用节点列表指包含当前可用的执行节点的列表。调度节点根据执行节点的状态信息更新可用节点列表,以便在任务分配时选择适合的执行节点。

负载均衡算法是用于平衡任务在执行节点之间的负载分布的算法。负载均衡算法根据执行节点的状态信息和任务需求,决定将编译命令分配给哪些执行节点,以达到资源合理利用和任务均衡的目的。

举例来说,在某个时间点(例如T1时刻),调度节点M获取节点A、B、C的当前状态信息:节点A的负载为70%,节点B的负载为50%,节点C的负载为80%,节点D的负载为30%。基于这些信息,调度节点更新可用节点列表,只有节点B、D的负载在可接受范围(例如是0-50%)内,因此可用节点列表中只包含节点B、D。

在任务分配时,调度节点使用负载均衡算法从可用节点列表中选择适合的执行节点。如果有20个编译命令需要分配,负载均衡算法可以决定将20个编译命令分配给节点B、D,以平衡节点间的负载情况。

本实施例中,分配每条编译命令对应的一个或多个执行节点涉及到获取节点状态信息、更新可用节点列表以及使用负载均衡算法来进行任务分配。通过这些步骤,系统可以实现负载均衡、资源合理利用和任务均衡分配。

由此,调度节点获取注册到其上的每个节点的当前状态信息。当前状态信息可以包括节点的负载情况、可用性、性能指标等。根据每个节点的当前状态信息,调度节点会更新可用节点列表。该可用节点列表记录了系统中可用于执行编译任务的节点。调度节点会使用负载均衡算法从可用节点列表中选择一个或多个节点,来为每条编译命令分配对应的执行节点。负载均衡算法可以根据节点的负载情况、性能指标等因素,使任务尽可能地均匀地分配给各个节点。

这样做的好处是,通过获取节点的当前状态信息并更新可用节点列表,系统可以动态地感知节点的可用性和负载情况,这样,可以在分配编译任务时,选择性地将任务分配给空闲节点或负载较低的节点,以充分利用系统资源,提高整体的编译效率;使用负载均衡算法选择执行节点,可以确保编译任务在各个节点上均匀分布,这样可以避免某些节点负载过重,而其他节点处于空闲状态的情况,从而提高系统的整体性能和效率;由于节点的当前状态信息是动态获取和更新的,系统可以根据节点的实际情况进行自适应调整,并且,当节点状态发生变化时,例如节点负载增加或减少,系统可以及时更新可用节点列表,并根据负载均衡算法重新分配编译任务,以适应系统的变化和优化编译效果。综上所述,通过获取节点状态信息、更新可用节点列表和使用负载均衡算法,系统可以实现动态节点分配和负载均衡,以提高分布式编译系统的效率和性能,该方法可以根据实际情况进行自适应调整,确保编译任务在各个节点上均匀分布,并充分利用系统资源。

在一些实施例中,所述分配每条编译命令对应的一个或多个执行节点(即步骤S102),包括:

获取注册至所述调度节点的每个节点的当前状态信息;

根据每个节点的当前状态信息,更新可用节点集合;

使用负载均衡算法,从所述可用节点集合中确定每条编译命令对应的一个或多个执行节点。

在一些实施例中,所述分配每条编译命令对应的一个或多个执行节点(即步骤S102),包括:

获取注册至所述调度节点的每个节点的当前状态信息;

根据每个节点的当前状态信息,更新可用节点队列;

使用负载均衡算法,从所述可用节点队列中确定每条编译命令对应的一个或多个执行节点。

其中,可用节点队列例如可以存储于redis数据库。

继续参见图1,在一些实施例中,每个需求节点通过NFS协议设置自身对应的共享目录;

所述方法还包括:

步骤S103:在分配所有编译命令对应的执行节点后,通知所有分配到的执行节点执行挂载命令,以使所有分配到的执行节点挂载至对应的共享目录;

步骤S104:在接收到所有需求节点发送的编译结束通知信息后,通知所有分配到的执行节点执行取消挂载命令。

NFS协议指Network File System(NFS),是一种用于在网络上共享文件系统的协议。需求节点通过NFS协议设置自身对应的共享目录,使得其他节点可以访问和读取该共享目录中的文件。

共享目录是一个在网络上可以共享访问的文件目录,其中包含了编译任务所需的源代码文件(即输入文件)等资源。

执行节点通过NFS协议挂载到需求节点的文件系统,相当于将需求节点的一个目录(即共享目录)映射到执行节点的一个目录(例如是挂载目录),由此,执行节点可以像访问本地的一个目录一样访问需求节点的共享目录,只要修改编译命令中的访问文件路径即可。通过共享目录+编译命令级别的分布式调度执行,多个节点形成一个目录访问和计算资源共享的P2P共享编译网络,其中有一个编译任务调度中心(即调度节点)。

在一些实施例中,需求节点向调度节点发送编译请求和多条编译命令,调度节点在接收到编译请求后,为每条编译命令分配一个或多个执行节点,然后通知分配到的执行节点挂载至共享目录,最终实现分布式编译过程。

作为示例,执行端程序executor在编译前执行挂载命令,将需求节点的/home/ubuntu/aosp源代码目录挂载为远程编译节点的/home/executor/ninja的内网ip/home/ubuntu/aosp目录(即共享目录),则远程编译节点访问这个目录(即/home/executor/ninja的内网ip/home/ubuntu/aosp目录)就可以获取到所有的源代码文件。

例如一条编译命令gcc-I/home/ubuntu/aosp/build-o foo foo.cc在本地执行时会在指定目录/home/ubuntu/aosp/build下寻找输入文件。在远程执行时,远程编译节点的执行端程序executor先将编译命令内容修改为gcc-I/home/executor/ninja的内网ip/home/ubuntu/aosp/build-o foo foo.cc,这样远程编译节点就会到挂载的目录下通过NFS协议找输入文件,即可找到对应的输入文件。

在分布式编译中,调度节点根据任务调度算法,将编译命令分配给相应的一个或多个执行节点,以实现任务的并行执行和负载均衡。也就是说,一个编译命令可能被分配给多个执行节点,即,该编译命令的命令id可能被放入多个执行节点的待执行队列(例如是ready队列)中。

挂载命令是用于将执行节点挂载至需求节点的共享目录的命令,使得执行节点可以访问和读取需求节点共享目录中的文件,以便进行编译操作。

取消挂载命令是用于取消执行节点与需求节点共享目录之间的挂载关系的命令。取消挂载命令在编译任务完成后发送给执行节点,用于解除与共享目录的连接。

举例来说,假设有一个分布式编译系统,调度节点根据任务调度算法,将编译命令001和002分配给两个执行节点:节点A和节点B,命令id 001和002出现在节点A和节点B的待执行队列中。

调度节点通知执行节点A、B执行挂载命令。

执行节点A、B分别执行挂载命令,需求节点X的/home/ubuntu/aosp源代码目录通过NFS协议挂载为远程编译节点的/home/executor/ninja的内网ip/home/ubuntu/aosp目录。

在需求节点X发送编译结束通知信息给调度节点后,调度节点通知执行节点A、B执行取消挂载命令。

执行节点A、B接收到取消挂载命令后,取消与需求节点X的共享目录的挂载关系,完成任务的清理和释放。

在该示例中,执行节点(如节点A和节点B)执行挂载命令,将需求节点(节点X)的共享目录(/home/ubuntu/aosp源代码目录)挂载到执行节点的本地目录(/home/executor/ninja的内网ip/home/ubuntu/aosp目录)。一旦挂载完成,执行节点就可以通过NFS协议使用需求节点的共享目录,访问和读取共享目录中的文件。当执行节点需要访问共享目录中的文件时,可以向需求节点发送NFS请求。在节点A和节点B执行编译命令之前,执行端程序executor会修改编译命令内容,例如将编译命令中的路径(/home/ubuntu/aosp)修改为挂载目录的路径(/home/executor/ninja的内网ip/home/ubuntu/aosp),以确保节点A和节点B能够通过NFS协议找到所需的输入文件。其中,挂载目录即挂载到执行节点的本地目录。

由此,通过多个节点之间的共享目录+共享计算实现分布式编译。例如可以通过NFS(Network File System)协议设置共享目录,将每个需求节点的项目目录作为共享目录,自动挂载到相应的执行节点上,执行节点在执行编译命令时通过共享目录进行文件读写,这样就形成了目录访问和计算资源共享的P2P网络,其中调度节点作为调度中心,协调和管理各个执行节点的任务分配和执行。

具体而言,每个需求节点通过NFS协议设置自身对应的共享目录。NFS是一种分布式文件系统协议,允许不同节点之间通过网络访问和共享文件。在分配所有编译命令对应的执行节点后,调度节点会通知所有执行节点执行挂载命令。这些执行节点会根据自身分配到的编译命令,将自身挂载到对应的一个或多个共享目录上,以便在执行编译任务时可以访问和使用共享目录中的文件和资源。执行节点在挂载共享目录后,开始执行分配到它们的编译命令。此时执行节点可以通过共享目录访问所需的文件和资源,并执行相应的编译操作。在接收到所有需求节点发送的编译结束通知信息后,调度节点会通知所有执行节点执行取消挂载命令。执行节点会将其挂载到共享目录的连接断开,释放资源并结束任务。

这样做的好处是,通过使用NFS协议设置共享目录,不同节点之间可以共享文件和资源,这样,编译任务所需的文件和资源可以存储在共享目录中,供执行节点访问和使用,提高编译的效率和一致性;执行节点通过挂载共享目录,可以直接访问共享目录中的文件和资源,而无需通过网络传输,这减少了数据传输的延迟和网络带宽的负担,提高了访问和传输的效率;在任务开始前,执行节点动态挂载共享目录,使其与任务相关的文件和资源可用,任务完成后,执行节点取消挂载,释放资源,这种动态挂载和取消挂载的机制确保了资源的有效利用和及时释放,提高系统的灵活性和资源管理效果。综上所述,通过使用NFS协议设置共享目录、执行节点的挂载和取消挂载操作,系统可以实现共享文件和资源、高效访问和传输的效果,该方法简化了编译任务所需的文件和资源管理,并提高了分布式编译系统的效率和灵活性。

在一些实施例中,所述方法还包括:

将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;

将每条编译命令的命令标识发送至对应的执行节点,以使每个执行节点从redis数据库中查询自身对应的编译命令的执行状态;

针对每条编译命令执行以下处理:在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将redis数据库中所述编译命令的执行状态设置为已执行,并在redis数据库中删除所述编译命令。

redis(Remote Dictionary Server)数据库是一种内存数据库,用于存储数据的键值对。在分布式编译中,redis数据库可以用来存储编译命令和相关信息。

执行状态是编译命令在执行过程中的状态信息,如待执行、执行中或已执行。其中,待执行是编译命令的初始状态,表示该编译命令还未被执行节点执行。

举例来说,调度节点将两条编译命令的命令标识001和002放入redis数据库,并设置执行状态为待执行。例如,redis数据库中的数据如下:

Key:编译命令001,Value:执行状态待执行

Key:编译命令002,Value:执行状态待执行

接着,需求节点X将命令标识001、002发送至执行节点A、B。

执行节点A和B分别从redis数据库中查询执行状态。假设执行节点A查询到编译命令001的状态为待执行。执行节点A执行编译命令001,生成编译结果A001。需求节点X在接收到编译结果A001后,将redis数据库中编译命令001的执行状态设置为已执行,并删除该编译命令001的记录。

此时,redis数据库中的数据如下:

Key:编译命令002,Value:执行状态待执行

假设执行节点B查询到编译命令001的执行状态为已执行,编译命令002的状态为待执行。执行节点B执行编译命令002,生成编译结果B002。需求节点X接收到编译结果B002后,将redis数据库中编译命令002的执行状态设置为已执行,并删除该编译命令002的记录。

最终,redis数据库中不再包含任何编译命令的记录,表示所有编译命令已经执行完毕。

由此,将每条编译命令放入redis数据库,并将每条编译命令的执行状态设置为待执行。redis是一个内存数据库,可以高效地进行读写操作和状态管理。将每条编译命令的标识发送至对应的执行节点,使得每个执行节点可以从redis数据库中查询自身对应的编译命令的执行状态。执行节点通过查询执行状态来确定自己是否需要执行一条编译命令。在需求节点接收到编译命令的编译结果后,调度节点进行以下处理:将redis数据库中对应编译命令的执行状态设置为已执行,并从redis数据库中删除该编译命令。这样可以标记该编译命令已经执行完毕并清除相关的命令信息。

这样做的好处是,通过将编译命令存储在redis数据库中并设置执行状态,可以集中管理编译命令,并记录每条编译命令的执行状态,通过有效地管理和追踪每条编译命令的执行状态,可以避免命令丢失或混乱,并提供了对编译任务整体进度的掌控能力;将编译命令的标识发送至对应的执行节点,实现了分布式任务调度,每个执行节点可以根据编译命令的命令标识从redis数据库中查询待执行的编译命令,并执行相应的任务,这种分布式任务调度可以充分利用系统中的多个节点,并实现并行处理和资源的高效利用;当需求节点接收到编译结果后,更新redis数据库中对应编译命令的状态为已执行,并删除该编译命令,这样可以及时更新任务状态,并清理不再需要的命令信息,避免数据库冗余和资源浪费。综上所述,通过将编译命令存储在redis数据库中,并设置执行状态,以及通过发送命令标识和查询执行状态的方式实现任务调度和结果处理,该方法能够有效地管理编译命令和状态,实现分布式任务调度和并行处理,提高编译系统的效率和资源利用率。同时,及时更新执行状态和清理不需要的命令信息,保持数据库的整洁性和高效性。

在一个具体应用场景中,本申请实施例还提供了一种分布式编译方法,应用于调度节点,所述调度节点为多个节点的其中一个,所述方法包括:

接收每个需求节点发送的多条编译命令,每个需求节点为多个节点的其中一个;每个需求节点通过NFS协议设置自身对应的共享目录;

获取注册至所述调度节点的每个节点的当前状态信息;

根据每个节点的当前状态信息,更新可用节点列表;

使用负载均衡算法,从所述可用节点列表中确定每条编译命令对应的一个或多个执行节点,以使每个执行节点获取并执行自身对应的一条或多条编译命令,每个执行节点为多个节点的其中一个;

在分配所有编译命令对应的执行节点后,通知所有分配到的执行节点执行挂载命令,以使所有分配到的执行节点挂载至对应的共享目录;

将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;

将每条编译命令的命令标识发送至对应的执行节点,以使每个执行节点从redis数据库中查询自身对应的编译命令的执行状态;

针对每条编译命令执行以下处理:在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将redis数据库中所述编译命令的执行状态设置为已执行,并在redis数据库中删除所述编译命令;

在接收到所有需求节点发送的编译结束通知信息后,通知所有分配到的执行节点执行取消挂载命令。

需要说明的是,在能够实现的前提下,上述各实施例中的各步骤的顺序可以进行调整,本申请不对此设限。

(分布式编译系统)

继续参见图2至图6,本申请实施例还提供了一种分布式编译系统,所述系统包括至少一个需求节点、调度节点和至少一个执行节点;

每个需求节点用于向所述调度节点发送多条编译命令;

所述调度节点用于分配每条编译命令对应的一个或多个执行节点;

每个执行节点用于获取并执行自身对应的一条或多条编译指令以得到一个或多个编译结果,并将每个编译结果分别发送至对应的需求节点。

本实施例中,分布式编译系统是一种具有分布式特性的编译系统,由多个节点组成,包括至少一个需求节点、调度节点和至少一个执行节点。该系统通过将编译任务分布到多个节点上并实现节点间的协作和通信,以提高编译效率和并行处理能力。

需求节点有编译需求,向调度节点发送多条编译命令。需求节点将编译任务的具体要求和参数发送给调度节点,并等待接收编译结果。

调度节点在分布式编译系统中担任任务调度和协调的角色。调度节点接收来自需求节点的编译命令,根据分配策略将每条编译命令分配给一个或多个执行节点,以实现任务的并行执行和资源的合理利用。

每个执行节点根据调度节点分配的编译命令,获取并执行自身对应的一条或多条编译指令,生成一个或多个编译结果。执行节点将每个编译结果分别发送给对应的需求节点。

需求节点例如可以安装有客户端程序ninja,调度节点例如可以安装有服务端程序scheduler,执行节点例如可以安装有执行端程序executor。

举例来说,假设有一个分布式编译系统,包括一个需求节点X、一个调度节点Y和两个执行节点A和B。需求节点X向调度节点Y发送三条编译命令:001、002和003。

调度节点Y根据任务调度策略将编译命令001、002和003分配给执行节点A、B。

执行节点A获取并执行编译命令001,生成编译结果Result001,并将Result001发送给需求节点X。

执行节点B获取并执行编译命令002和命令003,分别生成编译结果Result002和Result003,并将Result002发送给需求节点X,将Result003发送给需求节点X。

最终,需求节点X接收到编译结果Result001、Result002和Result003,该分布式编译系统实现了分布式编译过程,通过分布式的任务分配和结果交互,实现了编译任务的并行处理和结果的返回。

由此,该分布式编译系统包括至少一个需求节点、调度节点和至少一个执行节点。需求节点用于向调度节点发送多条编译命令。调度节点负责分配每条编译命令对应的一个或多个执行节点。执行节点获取并执行自身对应的一条或多条编译命令,并生成一个或多个编译结果。最后,执行节点将每个编译结果分别发送给对应的需求节点。

这样做的好处是,通过将编译任务分发到不同的节点上,系统实现了分布式任务调度,需求节点发送编译命令到调度节点,调度节点根据任务负载和资源可用性,将编译命令分配给合适的执行节点,这种分布式任务调度机制充分利用了系统中的多个节点,提高了编译任务的并行性和整体效率;每个执行节点获取并执行自身对应的一条或多条编译命令,这使得多个编译任务可以在不同的节点上同时进行,实现并行执行,通过利用多个执行节点的计算资源,系统能够更高效地利用系统资源,加速编译过程,提高编译效率和速度;执行节点在完成编译任务后,将每个编译结果分别发送至对应的需求节点,这种结果反馈和通信机制确保了编译结果的准确传递和任务的完整性,需求节点可以根据接收到的编译结果进行后续处理,如错误检测、构建输出等。综上所述,该分布式编译系统通过分布式任务调度、并行执行和结果反馈机制,实现了高效的分布式编译,这种系统架构利用多个节点的计算资源,提高编译效率和速度。同时,通过结果反馈和通信机制,保证编译结果的正确传递和任务的完整性。

在一些实施例中,所述调度节点还用于将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;以及,将每条编译命令的命令标识发送至对应的执行节点;

每个执行节点用于根据接收到的一个或多个命令标识,从redis数据库中查询每个命令标识对应的编译命令的执行状态,从redis数据库中读取其中一条或多条编译命令并执行;

所述调度节点还用于针对每条编译命令,在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将所述编译命令的执行状态设置为已执行,并在redis数据库中删除对应的编译命令。

命令标识是用于唯一标识每条编译命令的标识符。执行状态指示编译命令在执行过程中的状态信息,如待执行、执行中或已执行。

举例来说,调度节点Y接收到三条编译命令:001、002和003。调度节点Y将这些编译命令放入redis数据库,并将它们的执行状态设置为待执行。

redis数据库中的数据如下:

Key:编译命令001,Value:执行状态待执行

Key:编译命令002,Value:执行状态待执行

Key:编译命令003,Value:执行状态待执行

调度节点Y将编译命令的命令标识001、002和003发送至对应的执行节点,即执行节点A、B。

执行节点A从redis数据库中查询编译命令001的执行状态,发现其状态为待执行。执行节点A读取编译命令001并执行。在任务执行完成后,需求节点X接收到编译命令001的编译结果,调度节点Y将redis数据库中编译命令001的执行状态设置为已执行。

执行节点B从redis数据库中查询编译命令001的执行状态,发现其状态为已执行。执行节点B从redis数据库中查询编译命令002的执行状态,发现其状态为待执行。执行节点B读取编译命令002并执行。在任务执行完成后,需求节点X接收到编译命令002的编译结果,调度节点Y将redis数据库中编译命令002的执行状态设置为已执行。

执行节点A从redis数据库中查询编译命令002的执行状态,发现其状态为已执行。执行节点A从redis数据库中查询编译命令003的执行状态,发现其状态为待执行。执行节点A读取编译命令003并执行。在任务执行完成后,需求节点X接收到编译命令003的编译结果,调度节点Y将redis数据库中编译命令003的执行状态设置为已执行。

此时,redis数据库中的数据如下:

Key:编译命令001,Value:执行状态已执行

Key:编译命令002,Value:执行状态已执行

Key:编译命令003,Value:执行状态已执行

调度节点Y在redis数据库中删除编译命令001、002和003的记录。

通过redis数据库中编译命令的执行状态的管理,调度节点可以控制编译任务的分配和执行,并及时更新任务的执行状态。

由此,调度节点将每条编译命令放入redis数据库,并将每条编译命令的执行状态设置为待执行。redis数据库用于存储编译命令和相应的状态信息。调度节点将每条编译命令的命令标识发送至对应的执行节点。执行节点根据接收到的一个或多个命令标识,从redis数据库中查询每个命令标识对应的编译命令的执行状态,并读取其中一条或多条编译命令进行执行。在发出编译命令的需求节点接收到编译命令的编译结果后,调度节点对该编译命令进行以下处理:将编译命令的执行状态设置为已执行,并在redis数据库中删除对应的编译命令。

本申请实施例对调度节点从redis数据库中删除编译命令的时机不作限定,其例如可以是该编译命令被执行完毕后,也可以是该编译命令对应的同一需求节点的所有编译命令全部执行完毕后,也可以是所有需求节点的所有编译命令全部执行完毕后。

这样做的好处是,通过将编译命令和状态信息存储在redis数据库中,调度节点可以有效地管理和追踪编译命令的执行状态,这样可以确保任务的顺序执行和状态的准确管理;调度节点根据需求节点发送的编译命令,将命令标识分发给相应的执行节点,执行节点根据命令标识从redis数据库中查询并执行编译命令,这种动态分发和执行机制使得编译任务可以根据系统负载和资源情况进行动态调整,提高系统的灵活性和任务处理效率;调度节点在需求节点接收到编译结果后,更新对应编译命令的状态为已执行,并从redis数据库中删除该编译命令,这种结果反馈和清理机制保证了任务状态的同步和数据库的清理,确保系统的一致性和可靠性。综上所述,通过使用redis数据库管理编译命令和状态信息,并实现编译命令的分发、执行结果的反馈和清理,系统能够实现分布式编译任务的管理和控制,该方法提高了任务的顺序执行和状态追踪的能力,同时保证了系统的可靠性和一致性。

在一些实施例中,每个执行节点采用以下方式执行自身对应的编译命令:

将接收到的一个或多个命令标识放入自身对应的待执行队列中;

当所述待执行队列非空时,检测自身负载是否过重;

当自身负载非过重时,从所述待执行队列中取出一个命令标识;

根据取出的命令标识,从redis数据库中查询所述命令标识对应的编译命令的执行状态;

如果是待执行,则将其设置为执行中,并从redis数据库中读取所述命令标识对应的编译命令并执行;

如果非待执行,则检测所述待执行队列是否全部执行完成;如果否,则从所述待执行队列中取出下一个命令标识。

每个执行节点具有对应的待执行队列,用于存储待执行的命令标识。执行节点将接收到的命令标识放入自身对应的待执行队列中,以便按照顺序逐个执行。

负载用于表征执行节点当前的工作负荷或资源占用情况。例如通过计算节点上正在执行的任务数、CPU利用率等指标来评估。作为一个示例,当正在执行的任务数大于预设数量时,确认执行节点负载过重;当正在执行的任务数不大于预设数量时,确认执行节点负载非过重。作为另一个示例,当CPU利用率大于预设数值时,确认执行节点负载过重;当CPU利用率不大于预设数值时,确认执行节点负载非过重。

举例来说,执行节点A、B接收到三个编译命令001、002和003。执行节点A、B分别将3个命令标识放入自身的待执行队列中。

执行节点A进行负载检测,假设当前负载不过重。执行节点A从待执行队列中取出命令标识001,并查询redis数据库中对应的编译命令的执行状态。如果执行状态是待执行,则将其设置为执行中,并从redis数据库中读取命令标识001对应的编译命令并执行。

执行节点B根据命令标识001查询redis数据库中对应的编译命令的执行状态。如果执行状态是执行中,则检查自身的待执行队列是否全部执行完成。如果还有未执行的命令标识,执行节点B从待执行队列中取出下一个命令标识002。执行节点B根据命令标识002查询redis数据库中对应的编译命令的执行状态。如果执行状态是待执行,则将其设置为执行中,并从redis数据库中读取命令标识002对应的编译命令并执行。

执行节点A在执行完编译命令001后,检查自身的待执行队列是否全部执行完成。如果还有未执行的命令标识,执行节点A从待执行队列中取出下一个命令标识002。执行节点A根据命令标识002查询redis数据库中对应的编译命令的执行状态。如果执行状态是执行中,则检查自身的待执行队列是否全部执行完成。如果还有未执行的命令标识,执行节点A从待执行队列中取出下一个命令标识003。执行节点A根据命令标识003查询redis数据库中对应的编译命令的执行状态。如果执行状态是待执行,则将其设置为执行中,并从redis数据库中读取命令标识003对应的编译命令并执行。

当命令标识001、002和003的编译命令执行完成后,调度节点Y将这三个编译命令的命令标识从redis数据库中删除。通过待执行队列、负载检测和redis数据库的使用,执行节点可以按顺序获取编译命令、检查执行状态,并进行相应的执行操作,实现分布式编译任务的执行。

由此,每个执行节点将接收到的一个或多个命令标识放入自身对应的待执行队列中。待执行队列用于存储等待执行的命令标识。当待执行队列非空时,执行节点会检测自身的负载情况。如果负载非过重,执行节点从待执行队列中取出一个命令标识,并进行下一步操作;如果负载过重,则暂时不执行任务,等待负载减轻后再继续任务调度。根据取出的命令标识,执行节点从redis数据库中查询命令标识对应的编译命令的执行状态。如果执行状态是待执行,则将其设置为执行中,并从redis数据库中读取该命令标识对应的编译命令进行执行。如果执行状态非待执行,执行节点会检测待执行队列是否全部执行完成。如果还有待执行任务,则从待执行队列中取出下一个命令标识,重复上述步骤;如果所有任务都已执行完成,则等待进一步的任务调度。

这样做的好处是,执行节点根据自身负载情况来决定是否执行任务,通过检测待执行队列和负载情况,可以避免执行节点过载和资源浪费;每个执行节点的待执行队列存储了等待执行的命令标识,多个执行节点可以并行地执行多个编译命令,同时,通过查询执行状态和执行判断,保证任务的顺序性和执行状态的一致性;待执行队列管理了任务的顺序和调度,通过检测队列状态和任务执行情况,每个执行节点可以灵活地管理自己的待执行队列,选择是否执行编译命令,以适应系统的动态变化和任务处理的灵活性。综上所述,通过使用待执行队列、负载检测和执行状态查询等机制,系统实现了分布式编译任务的并行执行和任务调度。该方法能够实现负载均衡、任务顺序性和任务调度的灵活性,提高分布式编译系统的效率和性能。

在一些实施例中,所述调度节点还用于在编译过程中,周期性地向每个执行节点发送健康检查命令;

每个执行节点还用于在接收到所述健康检查命令后返回节点信息;

所述调度节点还用于当一个周期内至少一个执行节点未返回节点信息时,将未返回节点信息的至少一个执行节点对应的至少一条编译命令重新分配给其他节点,并将重新分配的编译命令的命令标识发送至重新分配的对应节点。

健康检查命令是由调度节点周期性地发送给执行节点的命令,用于检查执行节点的健康状态。执行节点接收到健康检查命令后,返回自身的节点信息作为回复。

节点信息指执行节点返回给调度节点的信息,例如包括节点的状态、可用性、负载等。

调度节点在检测到一个周期内至少一个执行节点未返回节点信息时,重新分配未返回节点信息的执行节点对应的编译命令给其他可用节点。

举例来说,调度节点Y周期性地向执行节点A、B、C发送健康检查命令。该周期例如可以是1秒钟、10秒钟、30秒钟、1分钟、3分钟、5分钟等。

执行节点A、B、C接收到健康检查命令后,返回各自的节点信息给调度节点Y。

在某个周期中,执行节点B未能及时返回节点信息。

调度节点Y检测到执行节点B未返回节点信息,将执行节点B对应的编译命令重新分配给其他可用节点。假设将编译命令002重新分配给执行节点A。

调度节点Y将编译命令002的命令标识发送至执行节点A。

执行节点A将编译命令002的命令标识放入自身待执行队列。

通过周期性的健康检查和节点信息的交互,调度节点可以监控执行节点的状态。当某个执行节点未能返回节点信息时,调度节点可以重新分配对应的编译命令给其他可用节点,以保证编译任务的顺利执行。

作为示例,在健康检查时,调度节点发送一个整数checkId(可选)作为健康检查命令,执行节点返回当前的待执行命令数(可选)。这两个字段均为可选字段,因为只要有消息返回,即可表明该节点是健康的。其中,待执行命令数例如是执行节点的待执行队列中的命令数量。

由此,调度节点在编译过程中周期性地向每个执行节点发送健康检查命令。这些健康检查命令用于检测执行节点的状态和可用性。每个执行节点在接收到健康检查命令后,返回节点信息给调度节点。节点信息可以包括节点的可用性、负载情况、性能指标等。在一个周期内,如果至少一个执行节点未返回节点信息,说明该执行节点可能出现故障或不可用。调度节点会将未返回节点信息的至少一个执行节点对应的至少一条编译命令重新分配给其他节点。调度节点将重新分配的编译命令的命令标识发送至重新分配的对应节点,以通知其执行重新分配的编译任务。

这样做的好处是,通过周期性地发送健康检查命令并接收节点信息,调度节点可以实时监测执行节点的健康状态,这有助于及时发现故障节点或不可用节点,提高系统的可靠性和稳定性;如果一个执行节点未返回节点信息,调度节点会重新分配该节点的编译命令给其他节点,这种故障节点的处理机制可以避免任务被阻塞和延迟,确保编译任务的顺利执行和系统的稳定性;通过重新分配编译命令和命令标识的发送,调度节点可以动态管理节点和任务的分配,当节点出现故障或不可用时,调度节点能够灵活地重新分配任务给其他可用节点,以保证任务的高效执行和资源的充分利用。综上所述,通过周期性的健康检查命令、节点信息的返回和重新分配编译命令的机制,系统可以实现对执行节点健康状态的监测、故障节点的处理和动态节点管理,该方法提高了系统的可靠性、稳定性和任务的执行效率,确保编译任务能够在分布式环境下顺利完成。

继续参见图2至图6,在一个具体应用场景中,本申请实施例还提供了一种分布式编译系统,所述系统包括至少一个需求节点、调度节点和至少一个执行节点;

每个需求节点用于向所述调度节点发送多条编译命令;

所述调度节点用于分配每条编译命令对应的一个或多个执行节点;

所述调度节点还用于将每条编译命令放入redis数据库,并将redis数据库中每条编译命令的执行状态设置为待执行;

所述调度节点还用于将每条编译命令的命令标识发送至对应的执行节点;

每个执行节点用于根据接收到的一个或多个命令标识,从redis数据库中查询每个命令标识对应的编译命令的执行状态,从redis数据库中读取其中一条或多条编译命令并执行;

所述调度节点还用于针对每条编译命令,在发出所述编译命令的需求节点接收到所述编译命令的编译结果后,将所述编译命令的执行状态设置为已执行,并在redis数据库中删除对应的编译命令;

所述调度节点还用于在编译过程中,周期性地向每个执行节点发送健康检查命令;

每个执行节点还用于在接收到所述健康检查命令后返回节点信息;

所述调度节点还用于当一个周期内至少一个执行节点未返回节点信息时,将未返回节点信息的至少一个执行节点对应的至少一条编译命令重新分配给其他节点,并将重新分配的编译命令的命令标识发送至重新分配的对应节点。

继续参见图5,各个组件之间采用图5中的工作时序进行分布式编译。

继续参见图6,调度节点(master节点)设置有服务端程序scheduler和redis数据库,其他节点(work节点)设置有客户端程序ninja和执行端程序executor。

继续参见图2,每个需求节点采用以下方式执行编译任务:

R1:开始;

R2:ninja启动编译;

R3:构建任务清单;

R4:构建编译计划;

R5:解析出多条编译命令;

R6:检测是否可以启动分布式编译;如果是,则执行R7;如果否,则本地ninja进程编译,执行R8;

R7:将多条编译命令发送至调度节点;

R8:编译完成;

R9:检测编译过程是否有报错(例如可以通过执行结果信息来进行检测);如果没有报错,则执行R10;如果有报错,则打印出错日志,执行R11;

R10:获取目标产物(即编译结果);

R11:结束。

继续参见图3,调度节点采用以下方式执行调度和管理任务:

T1:开始;

T2:接收到来自executor的注册信息;

T3:接收到来自ninja的注册信息;

T4:为ninja分配合适的executor,并向分配到的所有executor发送挂载命令;

T5:接收到来自ninja的多条编译命令;

T6:针对接收到的每条编译命令,设置redis数据库中的编译命令的执行状态为待执行;

T7:将编译命令的命令标识发送给分配到的每一个executor;

T8:检测执行节点是否健康;如果不健康,则执行T9;如果健康,则执行T10;健康检查和重发机制在整个编译过程中都存在,保证系统可靠性;

T9:重新分配executor并重新发送命令标识,执行T8;

T10:检测编译命令是否执行成功;如果不成功,则执行T11;如果成功,则执行T13;

T11:将编译命令的命令标识发送给本地executor执行,执行T12;

T12:检测编译命令是否执行成功;如果成功,则执行T13;如果不成功,则执行T15;

T13:修改redis数据库中的编译命令的执行状态为已执行,向ninja返回成功信号和编译日志,执行T14;

T14:检测编译命令是否全部执行完成;如果是,则执行T16;如果否,则执行T5;

T15:向ninja返回失败信号和编译日志,执行T16;

T16:编译结束;

T17:向分配到的所有executor发送取消挂载命令;

T18:结束。

继续参见图4,每个执行节点采用以下方式执行自身对应的编译命令:

S1:开始;

S2:获取当前机器(即当前节点)的当前状态信息;

S3:评估自身是否可以作为执行节点;如果是,则执行S4;如果否,则打印错误信息,并执行S14;

S4:到scheduler中注册成为一个executor;

S5:接收到来自scheduler的挂载命令(例如是mount命令)并执行;

S6:接收到来自scheduler的一个或多个命令标识放入自身对应的待执行队列中;

S7:检测所述待执行队列是否为空;如果是,则执行S6;如果否,则执行S8;

S8:检测当前机器自身负载是否过重;如果是,则executor睡眠,等待负载降低后再执行S7;如果否,则执行S9;

S9:从所述待执行队列中取出一个命令标识,并根据取出的命令标识,从redis数据库中查询所述命令标识对应的编译命令的执行状态;

S10:检测该编译命令的执行状态是否是待执行;如果是,则执行S11;如果否,则忽略该条编译命令,并执行S12;

S11:将该编译命令的执行状态设置为执行中,并从redis数据库中读取所述命令标识对应的编译命令并执行,执行S12;

S12:检测所述待执行队列是否全部执行完成;如果是,则执行S13;如果否,则执行S9;

S13:当接收到来自scheduler的取消挂载命令时,执行取消挂载命令(例如是umount命令),并执行S14;

S14:结束。

(节点)

本申请提供了一种节点,所述节点包括存储器和至少一个处理器,所述存储器存储有计算机程序,所述至少一个处理器被配置成执行所述计算机程序时实现以下步骤:

当所述节点作为需求节点时,向调度节点发送多条编译命令;

当所述节点作为调度节点时,分配每条编译命令对应的一个或多个执行节点;

当所述节点作为执行节点时,获取并执行自身对应的一条或多条编译指令以得到一个或多个编译结果,并将每个编译结果分别发送至对应的需求节点。

在一些实施例中,每个节点例如可以采用计算机、服务器等计算设备。

举例来说,假设有一个分布式编译系统,包括三个节点:节点X、节点Y和节点Z。

当节点X作为需求节点时,向调度节点Y发送三条编译命令:001、002和003。其中,编译命令002指定本机节点(即节点X)执行。

调度节点Y接收到来自节点X的编译命令,将每条命令分配给节点X、Z。此时,节点X也作为一个执行节点。

执行节点X、Z根据分配到的编译命令,获取并执行对应的编译指令。假设执行节点Z执行编译命令001和003,并生成编译结果Result001和Result003,将Result001和Result003发送给节点X。

节点X作为需求节点接收到来自执行节点Z的编译结果Result001和Result003。

执行节点X执行编译命令002,并生成编译结果Result002。此时,编译结果Result002将存储于本机节点(即节点X),相当于将编译结果发送至对应的需求节点(即节点X)。

在本实施例中,节点X作为需求节点向调度节点Y发送编译命令,调度节点Y将编译命令分配给执行节点X、Z。执行节点X、Z执行编译指令并将结果发送给需求节点X。通过这样的分布式编译过程,实现了任务的分配和执行,并将结果返回给需求节点。

由此,针对每个节点,当节点作为需求节点时,可以向调度节点发送多条编译命令。需求节点负责发起编译任务,将编译命令发送给调度节点进行处理。当节点作为调度节点时,可以分配每条编译命令对应的一个或多个执行节点。调度节点负责任务的调度和分配,将编译命令分发给适合执行的节点。当节点作为执行节点时,可以获取并执行自身对应的一条或多条编译指令,生成一个或多个编译结果,然后将每个编译结果分别发送至对应的需求节点。

这样做的好处是,通过将不同的节点配置为需求节点、调度节点和执行节点,系统实现了分布式任务处理,这样可以将编译任务分布到不同的节点上,充分利用系统资源,提高编译任务的并行处理能力和整体效率;同一个节点可以在不同的时刻充当不同的角色,根据任务需求进行切换,这种灵活的节点角色切换机制使得系统可以根据实际情况进行任务分配和处理,提高系统的灵活性和适应性;其中,需求节点自身可以作为执行节点之一,即该需求节点同时充当编译角色和执行角色,如有必要,调度节点也可以这样,即调度节点也可以作为执行节点之一,同时充当调度角色和执行角色;执行节点生成的编译结果会被发送至对应的需求节点,以完成任务的协作和结果的传递,这种结果通信机制保证了编译结果的准确性和及时性,使得系统能够有效地进行任务协同和结果整合。综上所述,根据实际应用中的需要,通过将节点配置为需求节点、调度节点和执行节点,系统实现了分布式任务处理和节点角色切换,该方法能够充分利用系统资源,提高编译任务的并行处理能力和整体效率。同时,通过结果通信和协作机制,保证了任务的协同和结果的准确传递,提高系统的可靠性和完成度。

参见图7,图7是本申请实施例提供的一种节点10的结构框图。

节点10例如可以包括至少一个存储器11、至少一个处理器12以及连接不同平台系统的总线13。

存储器11可以包括易失性存储器形式的(计算机)可读介质,例如随机存取存储器(RAM)111和/或高速缓存存储器112,还可以进一步包括只读存储器(ROM)113。其中,存储器11还存储有计算机程序,计算机程序可以被处理器12执行,使得处理器12实现上述任一项方法的步骤。存储器11还可以包括具有至少一个程序模块115的实用工具114,这样的程序模块115包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例的每一个或某种组合中可能包括网络环境的实现。

相应的,处理器12可以执行上述计算机程序,以及可以执行实用工具114。处理器12可以采用一个或多个应用专用集成电路(ASIC,Application Specific IntegratedCircuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件。

总线13可以为表示几类总线结构的一种或多种,包括存储器总线或者存储器控制器、外围总线、图形加速端口、处理器或者使用多种总线结构的任意总线结构的局域总线。

节点10也可以与一个或多个外部设备例如键盘、指向设备、蓝牙设备等通信,还可与一个或者多个能够与该节点10交互的设备通信,和/或与使得该节点10能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等)通信。这种通信可以通过输入输出接口14进行。并且,节点10还可以通过网络适配器15与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。网络适配器15可以通过总线13与节点10的其它模块通信。应当明白,尽管图中未示出,但在实际应用中可以结合节点10使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储平台等。

(计算机可读存储介质)

本申请实施例还提供了一种计算机可读存储介质,其具体实施例与上述方法实施例中记载的实施例、所达到的技术效果一致,部分内容不再赘述。

所述计算机可读存储介质存储有计算机程序,所述计算机程序被至少一个处理器执行时实现上述任一项方法的步骤或者实现上述任一项调度节点的功能。

计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。在本申请实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。计算机可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。

计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读存储介质还可以是任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等,或者上述的任意合适的组合。可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,程序设计语言包括Java、C++、Python、C#、JavaScript、PHP、Ruby、Swift、Go、Kotlin等。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户设备上部分在远程计算设备上执行、或者完全在远程计算设备或调度节点上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。

(计算机程序产品)

本申请实施例还提供了一种计算机程序产品,其具体实施例与上述方法实施例中记载的实施例、所达到的技术效果一致,部分内容不再赘述。

本申请提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被至少一个处理器执行时实现上述任一项方法的步骤或者实现上述任一项调度节点的功能。

参见图8,图8是本申请实施例提供的一种计算机程序产品的结构示意图。

所述计算机程序产品用于实现上述任一项方法的步骤或者实现上述任一项调度节点的功能。计算机程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的计算机程序产品不限于此,计算机程序产品可以采用一个或多个计算机可读介质的任意组合。

本申请从使用目的上,效能上,进步及新颖性等观点进行阐述,已符合专利法所强调的功能增进及使用要件,本申请以上的说明书及说明书附图,仅为本申请的较佳实施例而已,并非以此局限本申请,因此,凡一切与本申请构造,装置,特征等近似、雷同的,即凡依本申请专利申请范围所作的等同替换或修饰等,皆应属本申请的专利申请保护的范围之内。

相关技术
  • 数据处理方法、区块链节点、系统和计算机可读存储介质
  • 一种系统关键节点访问方法、终端及计算机可读存储介质
  • 一种统一认证方法、分布式系统和计算机可读存储介质
  • 分布式文件删除方法、装置、系统及计算机可读存储介质
  • 一种分布式显示方法、系统、设备及计算机可读存储介质
  • 分布式存储系统的缓存方法、节点和计算机可读介质
  • 一种分布式结构系统、管理分布式结构系统的方法及计算机可读存储介质
技术分类

06120116483342