我有一些数据需要处理.数据是一棵树.处理过程如下:取一个 node N.判断其所有子 node 是否都已处理.如果没有,请先处理.如果是,则处理N.因此,我们从上到下(递归地)处理叶,然后处理叶,然后处理叶的父 node ,依此类推,直到我们再次到达根.
我知道如何编写一个在一台计算机上运行的程序,以获取数据(即根 node )并按上述方式进行处理.这是一张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);
}
}
但是,我如何编写程序,以便将工作分发到一组计算机上(这些计算机都在同一个网络中,或者在某个本地网络中,或者在internet上)?我需要为此做些什么?
一些 idea / idea :
-
DataManager
应该在一台计算机上运行(主计算机/服务器?);DataHandler应该在所有其他(客户端?)上运行. -
DataManager
人需要通过某种身份证来了解计算机(那是什么身份证?)这些都是在DataManager
年的建设期间设置的. -
DataManager
必须能够在这些计算机上创建DataHandler
的新实例(或者在出现问题时杀死它们).怎样 -
DataManager
必须知道哪些计算机当前有DataHandler
的运行实例,哪些没有,这样它就可以决定哪个计算机可以生成下一个DataHandler
(或者,如果没有空闲的,等待).
这些不是要求!我不知道这些 idea 是否可行.
在上面的 idea 中,我假设每台计算机只能有一个DataHandler
的实例.我知道这不一定如此(因为CPU内核和线程…),但在我的用例中,实际情况可能是这样的:真正的DataManager
和DataHandler
不是独立的,而是在SolidWorks上下文中运行的.所以为了运行这些代码,我需要一个正在运行的SolidWorks实例.根据我的经验,同一个窗口上有多个SolidWorks实例无法(可靠地)工作.
据我所知,我需要的似乎是一种多计算机操作系统:在一台计算机设置中,点2、3和4通常由操作系统处理.第一点是OS(OS=DataManager
生成进程=DataHandlers
;OS跟踪数据=ProcessedData
,进程报告回来).
我到底想知道什么?
- 对单词、短语或介绍性文章的提示,使我能够深入探讨这个主题(以便能够实现这一点).可能是语言不可知论者.
- 适合这种情况的C#库/框架提示.
- 关于我应该做什么或不应该做什么的提示(典型的初学者问题).可能是语言不可知论者.
- 指向示例/演示C#项目的链接,例如GitHub上的链接.(如果不是C#,VB也可以.)