我正在研究关于分布式处理的code。我要感谢eliben
给我这个漂亮的post。我读了他的解释,但有一些黑点。据我所知,这些代码是用来在多台机器/客户机上分配任务的。我的问题是:
我最基本的问题是工作分配到不同机器的位置是什么?
为什么main函数中有if-else语句?
让我从更一般的角度开始这个问题。我认为我们通常在一个特定的块(独立内存部分)中启动Process
,而不是像这样一次传递所有的块:
chunksize = int(math.ceil(len(HugeList) / float(nprocs)))
for i in range(nprocs):
p = Process(
target = myWorker, # This is my worker
args=(HugeList[chunksize * i:chunksize * (i + 1)],
HUGEQ)
processes.append(p)
p.start()
在这个简单的例子中,我们有nprocs
过程。每个进程启动一个函数myWorker
的实例,该实例在指定的块上工作。在
我的问题是:
现在看一下gitHub
代码,我想理解mp_factorizer
?更具体地说,在这个函数中,我们没有块,而是一个巨大的队列(shared_job_q
)。这个巨大的队列由最大43个大小的子列表组成。此队列被传递到factorizer_worker
。在那里,我们通过get
获得这些子列表并将它们传递给串行工作者。我知道我们需要这个队列在客户机之间共享数据。在
我的问题是:
nprocs
(=8)进程调用factorizer_worker
函数的实例?在get
函数?在谢谢你的时间。在
只有在多台计算机上实际运行脚本时,才会向多台计算机分发。第一次运行脚本(不带client选项)时,它会在承载共享作业/结果队列的特定IP/端口上启动Manager服务器。除了启动Manager服务器外,runserver还将通过调用mp_factorzer充当工作进程。它还负责从结果队列收集结果并进行处理。您可以自行运行此脚本并获得完整的结果。在
但是,您也可以通过使用client选项在其他机器上运行脚本,将分解工作分发给其他机器。这将调用runclient,它将连接到您最初运行脚本时启动的现有管理器服务器。这意味着客户机正在访问runserver使用的相同共享队列,因此它们都可以从相同的队列中提取工作并将结果放入相同的队列。在
上述内容应涵盖问题1和2。在
我不太清楚你在问题3中问的是什么。我想您可能想知道为什么我们不显式地将列表的一个块传递给每个工人(就像您所包含的示例中一样),而不是将所有的块放入一个队列中。答案是因为
runserver
方法不知道实际将有多少工人。它知道它将启动8个工人。但是,它不想将HugeList
分成8个块并发送到它正在创建的8个进程,因为它希望支持远程客户端连接到Manager
并执行工作。因此,它为每个块选择一个任意大小的块(43
),并将该列表分成与消耗整个HugeList
所需大小相同的块,并将其放入Queue
。下面是runserver
中的代码:{{{3}你可以从一个cd9}返回一个进程,作为cd9}的结果。在
是的
我们没有43块。我们有X个块,每个块大小43。处理并处理每个工作进程的块。它得到哪一部分是任意的,取决于有多少工人以及每个工人的速度。在
一个。如果您的意思是现在脚本的每个实例都存在许多工作进程,那么服务器进程中有8个工作进程,每个客户端进程中有4个。在
不知道你这是什么意思。在
相关问题 更多 >
编程相关推荐