【问题标题】:Azure Worker Role DesignAzure 工作者角色设计
【发布时间】:2011-05-25 03:41:54
【问题描述】:

我正在尝试设计一个 azure worker 角色例程。工作人员角色轮询作业队列。对于每个作业,所需的线程数在作业消息中指定。作业正在运行可执行文件的实例。示例:可执行文件的名称是 Rax.exe。 Rax.exe 可以在不同数量的线程上运行。如果我们称它为 Rax.exe -T 2 它将创建两个线程。所以我们不必处理如何创建线程。我们只需使用适当的命令行参数调用 Rax.exe。我有超大工作者实例。所以,我可以同时运行 8 个线程。我想尽可能多地利用工人。我们可能有很多作业,每个作业都指定了不同数量的线程。

例子:

Job Queue:

1 Rax.exe -T 3
2 Rax.exe -T 5
3 Rax.exe -T 1
4 Rax.exe -T 8
5 Rax.exe -T 4

在这个例子中,我们有 5 个工作。工作人员读取第一条消息并开始工作。该作业消耗 3 个线程。一个工作线程可以有 8 个线程,因此剩余的 5 个线程可以通过从队列中运行另一个作业来使用。

目前,我不知道如何在工作角色中运行多个进程。我正在使用流程类的 waitForExit 方法。可执行文件的每个运行实例都会创建输出文件,因此我必须收集这些生成的文件。

我的问题:

1- 如何异步启动多个进程并在它们退出时得到通知?我必须在轮询作业队列的同时执行此操作。 2-这种作业调度是一个难题吗?谁能想出一个好的启发式方法?

编辑: 我认为,估计每项工作所需的运行时间会很有帮助。这种信息是存在的。有了这些信息,能解决吗?

【问题讨论】:

  • 您能否解释一下为什么要创建额外的进程而不是使用并行任务 API?这听起来很适合它。

标签: c# algorithm azure


【解决方案1】:

1- 如何异步启动多个进程并在它们退出时得到通知?我必须在轮询作业队列的同时执行此操作。

这很简单——你可以订阅Exited事件,而不是使用WaitForExit

2- 这种作业调度是一个难题吗?谁能想出一个好的启发式方法?

正如 Erno 在他的评论中所建议的,解决此问题的一种好方法是将问题传递给 Parallel Task API。虽然通用的多线程调度算法可能无法提供“最佳”调度解决方案,但它可以提供非常好的解决方案,只需很少的工作 - 并且由于工作的复杂性,有时通用调度算法可以胜过手工制作的解决办法。。

如果您对 Azure 上的批处理调度方法感兴趣,那么可能值得看看 Azure 上的一些 map-reduce 类型项目:

虽然这些方法主要是关于在多台机器上分配工作,但同样的方法也适用于在同一台机器内的多个内核之间分配工作。

【讨论】:

    【解决方案2】:

    您应该使用多个 Worker Role 实例。

    这就是在 Azure 平台/范式中完成多处理的方式。您可以让多个角色实例从同一个队列中抓取项目,这就是系统的设计方式。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2012-02-04
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多