Azure工作者角色设计

时间:2011-05-25 03:41:55

标签: c# algorithm azure

我正在尝试设计一个天蓝色的工人角色例程。辅助角色轮询作业队列。对于每个作业,在作业消息中指定所需的线程数。作业正在运行可执行文件的实例。示例:可执行文件的名称是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个线程。一个worker可以拥有8个线程,因此可以通过从队列中运行另一个作业来利用剩余的5个线程。

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

我的问题:

1-如何异步启动多个进程并在退出时收到通知?我必须在仍然轮询作业队列时执行此操作。 2-这种工作安排是一个难题吗?任何人都可以提出一个好的启发式吗?

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

2 个答案:

答案 0 :(得分:1)

  

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

这非常简单 - 您可以订阅WaitForExit事件

而不是使用Exited
  

2-这种工作安排是一个难题吗?任何人都可以提出一个好的启发式吗?

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

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

虽然这些方法主要是关于在多台机器上分配工作,但同一种方法可以应用于在同一台机器中跨多个核心分配工作。

答案 1 :(得分:0)

您应该使用多个工作者角色实例。

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