0

我正在研究有关分布式处理的代码gitHub我要感谢eliben这篇好文章。我已经阅读了他的解释,但有一些黑点。据我了解,该代码用于在多台机器/客户端中分配任务。我的问题是:

  1. 我最基本的问题是工作分配到不同机器的位置是什么?

  2. 为什么 main 函数中有 if else 语句?

  3. 让我以更笼统的方式开始这个问题。我认为我们通常从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每个进程都会启动一个作用于指定块的函数实例。

    我的问题是:

    • 对于在每个块中工作的每个进程,我们有多少个线程?
  4. 现在查看gitHub我试图理解的代码mp_factorizer?更具体地说,在这个函数中,我们没有块,而是一个巨大的队列(shared_job_q)。这个巨大的队列由最大大小为 43 的子列表组成。这个队列被传递到factorizer_worker. 通过那里get我们获取这些子列表并将它们传递给串行工作者。我知道我们需要这个队列来在客户端之间共享数据。

    我的问题是:

    • factorizer_worker我们是否为每个nprocs(=8) 进程调用函数的实例?
    • 每个流程的哪一部分数据起作用?(一般情况下,我们有 8 个进程和 43 个块。)
    • 每个进程有多少个线程?
    • 是否get从每个进程线程调用函数?

谢谢你的时间。

4

1 回答 1

2

仅当您实际在多台机器上运行脚本时才会分发到多台机器。第一次运行脚本(不带 --client 选项)时,它会在特定 IP/端口上启动 Manager 服务器,该 IP/端口托管共享作业/结果队列。除了启动 Manager 服务器之外,runserver 还将通过调用 mp_factorizer 来充当 worker。它还负责从结果队列中收集结果并进行处理。您可以自行运行此脚本并获得完整的结果。

但是,您也可以通过使用 --client 选项在其他机器上运行脚本来将分解工作分发到其他机器。这将调用 runclient,它将连接到您在初始运行脚本时启动的现有 Manager 服务器。这意味着客户端正在访问 runserver 正在使用的相同共享队列,因此它们都可以从相同的队列中提取工作并将结果放入相同的队列中。

以上应涵盖问题1和2。

我不确定您在问题 3 中要问什么。我您想知道为什么我们不明确地将列表的一部分传递给每个工作人员(就像您包含的示例中一样),而不是将所有块放入队列中。答案是因为该runserver方法不知道实际会有多少工人。它知道它将启动 8 个工人。但是,它不想HugeList将它们分成 8 个块并将它们发送到它正在创建的 8 个进程,因为它也希望支持远程客户端连接到Manager和工作。因此,它43为每个块(HugeListQueue. 这是执行此操作的代码runserver

chunksize = 43
for i in range(0, len(nums), chunksize):
    #print 'putting chunk %s:%s in job Q' % (i, i + chunksize)
    shared_job_q.put(nums[i:i + chunksize]) # Adds a 43-item chunk to the shared queue.

这样,你想要的任意数量的工作人员都可以连接到Manager服务器,从 中获取一个块shared_job_q,处理它,并返回一个结果。

我们是否为每个 nprocs(=8) 进程调用 factorizer_worker 函数的实例?

是的

每个流程的哪一部分数据起作用?(一般情况下,我们有 8 个进程和 43 个块。)

我们没有 43 个块。我们有 X 个块,每个大小为 43。每个工作进程只是从队列中抓取块并处理它们。它得到哪一部分是任意的,取决于有多少工人以及每个工人的速度。

每个进程有多少个线程?

一。如果您的意思是现在每个脚本实例都存在许多工作进程,那么服务器进程中有 8 个,每个客户端进程中有 4 个。

是否从每个进程线程调用 get 函数?

不知道你是什么意思。

于 2014-08-28T22:22:18.310 回答