我正在尝试设计一个天蓝色的工人角色例程。辅助角色轮询作业队列。对于每个作业,在作业消息中指定所需的线程数。作业正在运行可执行文件的实例。示例:可执行文件的名称是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-这种工作安排是一个难题吗?任何人都可以提出一个好的启发式吗?
编辑: 我认为,估算每项工作所需的运行时间将会有所帮助。存在这种信息。有了这些信息,它能解决吗?
答案 0 :(得分:1)
1-如何异步启动多个进程并在退出时收到通知?我必须在仍然轮询作业队列时执行此操作。
这非常简单 - 您可以订阅WaitForExit
事件
Exited
2-这种工作安排是一个难题吗?任何人都可以提出一个好的启发式吗?
正如Erno在他的评论中所建议的,解决这个问题的一个好方法是将问题传递给Parallel Task API。虽然一般的多线程调度算法可能无法提供“最优”的调度解决方案,但它可以为很少的工作提供非常好的解决方案 - 并且由于工作的复杂性,有时一般的调度算法可以胜过手工制作解决方案..
如果您对在Azure上安排批处理的方法感兴趣,那么可能值得查看Azure上的一些map-reduce类型项目:
虽然这些方法主要是关于在多台机器上分配工作,但同一种方法可以应用于在同一台机器中跨多个核心分配工作。
答案 1 :(得分:0)
您应该使用多个工作者角色实例。
这就是在Azure平台/范例中完成多处理的方式。您可以让多个角色实例从同一个队列中抓取项目,这就是系统的设计方式。