2011-05-25 100 views
1

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

实施例:

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 - 我怎样才能异步启动多个进程,当他们退出的通知?我仍然在轮询工作队列时这么做。这种工作安排是一个难题吗?任何人都可以想出一个很好的启发式吗?

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

+0

您能否解释为什么要创建额外的进程而不是使用并行任务API?这听起来很适合它。 – 2011-05-25 04:15:33

回答

1

1-如何异步启动多个进程并在退出时得到通知?我仍然在轮询工作队列时这么做。

这的人很简单 - 而不是使用WaitForExit,您可以订阅Exited事件

2 - 这是一种工作调度难的问题?任何人都可以想出一个很好的启发式吗?

正如Erno在他的评论中所建议的,解决此问题的一个好方法是将问题传递给并行任务API。虽然一般的多线程调度算法可能不提供“最优”调度解决方案,但它可以提供非常少的努力的真正好的解决方案 - 并且工作的复杂性,然后有时一般调度算法可以胜过手工解决方案..

如果您有兴趣在Azure上的批处理调度方式,那么它可能是值得考虑的一些在Azure上的地图,减少型项目:

虽然这些方法主要是有关分发到多台机器工作时,同一种方法可以适用于分配在同一台机器上的多个内核之间工作。

0

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

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