如何将工作分配给一组计算机
How to distribute work to a pool of computers
我有一些数据需要处理。数据是一棵树。处理过程如下:取一个节点 N。检查它的所有子节点是否都已处理。如果没有,请先处理它们。如果是,处理N。所以我们从上到下(递归)到叶子,然后处理叶子,然后是叶子的父节点等等,直到我们再次到达根。
我知道如何在一台计算机上编写一个 运行 的程序来获取数据(即根节点)并如上所述进行处理。这是 C# 中的草图:
// We assume data is already there, so I do not provide constructor/setters.
public class Data
{
public object OwnData { get; }
public IList<Data> Children { get; }
}
// The main class. We just need to call Process once and wait for it to finish.
public class DataManager
{
internal ISet<Data> ProcessedData { get; init; }
public DataManager()
{
ProcessedData = new HashSet<Data>();
}
public void Process(Data rootData)
{
new DataHandler(this).Process(rootData);
}
}
// The handler class that processes data recursively by spawning new instances.
// It informs the manager about data processed.
internal class DataHandler
{
private readonly DataManager Manager;
internal DataHandler(ProcessManager manager)
{
Manager = manager;
}
internal void Process(Data data)
{
if (Manager.ProcessedData.Contains(data))
return;
foreach (var subData in data.Children)
new DataHandler(Manager).Process(subData);
... // do some processing of OwnData
Manager.ProcessedData.Add(data);
}
}
但是我该如何编写程序才能将工作分配给一组计算机(它们都在同一个网络中,本地计算机或互联网)?我需要为此做什么?
一些thoughts/ideas:
-
DataManager
应该 运行 在一台计算机上(主计算机/服务器?); DataHandlers 应该 运行 对所有其他人(客户端?)。
DataManager
需要通过一些 ID(那是什么 ID?)了解计算机,这些 ID 在 DataManager
. 的构造期间设置
DataManager
必须能够在这些计算机上创建 DataHandler
的新实例(或在出现问题时终止它们)。怎么样?
DataManager
必须知道哪些计算机当前有 DataHandler
的 运行ning 实例,哪些没有,以便它可以决定在哪台计算机上生成下一个 DataHandler
(或者,如果 none 空闲,等待)。
这些不是要求!我不知道这些想法是否可行。
在上面的想法中,我假设每台计算机只能有一个 DataHandler
实例。我知道不一定如此(因为 CPU 核心和线程......),但在我的用例中它实际上可能是这样的:真正的 DataManager
和 DataHandler
不是独立的但在 SolidWorks 上下文中 运行。所以为了 运行 任何代码,我需要有一个 运行ning SolidWorks 实例。根据我的经验,同一 Windows 上的多个 SolidWorks 实例无法(可靠地)工作。
一知半解看来我需要的是一种多机-OS: 在单机设置中,通常会处理第2、3、4点由 OS。第 1 点是 OS(OS=DataManager
生成进程=DataHandlers
;OS 跟踪数据=ProcessedData
和进程报告)。
我到底想知道什么?
- 对单词、短语或介绍性文章的提示,使我能够深入探讨该主题(以便能够实现这一点)。可能与语言无关。
- 适用于这种情况的 C# 提示 libraries/frameworks。
- 关于我应该做什么或不应该做什么的提示(典型的初学者问题)。可能与语言无关。
- 指向 example/demonstration C# 项目的链接,例如在 GitHub 上。 (如果不是C#,VB也可以。)
您应该阅读有关微服务和队列的内容。像 rabbitmq。
生产者/消费者方法。
https://www.rabbitmq.com/getstarted.html
如果您将微服务与 Docker 集成,您可以做一些非常漂亮的事情。
我有一些数据需要处理。数据是一棵树。处理过程如下:取一个节点 N。检查它的所有子节点是否都已处理。如果没有,请先处理它们。如果是,处理N。所以我们从上到下(递归)到叶子,然后处理叶子,然后是叶子的父节点等等,直到我们再次到达根。
我知道如何在一台计算机上编写一个 运行 的程序来获取数据(即根节点)并如上所述进行处理。这是 C# 中的草图:
// We assume data is already there, so I do not provide constructor/setters.
public class Data
{
public object OwnData { get; }
public IList<Data> Children { get; }
}
// The main class. We just need to call Process once and wait for it to finish.
public class DataManager
{
internal ISet<Data> ProcessedData { get; init; }
public DataManager()
{
ProcessedData = new HashSet<Data>();
}
public void Process(Data rootData)
{
new DataHandler(this).Process(rootData);
}
}
// The handler class that processes data recursively by spawning new instances.
// It informs the manager about data processed.
internal class DataHandler
{
private readonly DataManager Manager;
internal DataHandler(ProcessManager manager)
{
Manager = manager;
}
internal void Process(Data data)
{
if (Manager.ProcessedData.Contains(data))
return;
foreach (var subData in data.Children)
new DataHandler(Manager).Process(subData);
... // do some processing of OwnData
Manager.ProcessedData.Add(data);
}
}
但是我该如何编写程序才能将工作分配给一组计算机(它们都在同一个网络中,本地计算机或互联网)?我需要为此做什么?
一些thoughts/ideas:
-
DataManager
应该 运行 在一台计算机上(主计算机/服务器?); DataHandlers 应该 运行 对所有其他人(客户端?)。 DataManager
需要通过一些 ID(那是什么 ID?)了解计算机,这些 ID 在DataManager
. 的构造期间设置
DataManager
必须能够在这些计算机上创建DataHandler
的新实例(或在出现问题时终止它们)。怎么样?DataManager
必须知道哪些计算机当前有DataHandler
的 运行ning 实例,哪些没有,以便它可以决定在哪台计算机上生成下一个DataHandler
(或者,如果 none 空闲,等待)。
这些不是要求!我不知道这些想法是否可行。
在上面的想法中,我假设每台计算机只能有一个 DataHandler
实例。我知道不一定如此(因为 CPU 核心和线程......),但在我的用例中它实际上可能是这样的:真正的 DataManager
和 DataHandler
不是独立的但在 SolidWorks 上下文中 运行。所以为了 运行 任何代码,我需要有一个 运行ning SolidWorks 实例。根据我的经验,同一 Windows 上的多个 SolidWorks 实例无法(可靠地)工作。
一知半解看来我需要的是一种多机-OS: 在单机设置中,通常会处理第2、3、4点由 OS。第 1 点是 OS(OS=DataManager
生成进程=DataHandlers
;OS 跟踪数据=ProcessedData
和进程报告)。
我到底想知道什么?
- 对单词、短语或介绍性文章的提示,使我能够深入探讨该主题(以便能够实现这一点)。可能与语言无关。
- 适用于这种情况的 C# 提示 libraries/frameworks。
- 关于我应该做什么或不应该做什么的提示(典型的初学者问题)。可能与语言无关。
- 指向 example/demonstration C# 项目的链接,例如在 GitHub 上。 (如果不是C#,VB也可以。)
您应该阅读有关微服务和队列的内容。像 rabbitmq。 生产者/消费者方法。
https://www.rabbitmq.com/getstarted.html
如果您将微服务与 Docker 集成,您可以做一些非常漂亮的事情。