【问题标题】:How can I get started creating a multithreaded load balancer?如何开始创建多线程负载均衡器?
【发布时间】:2016-03-31 14:40:19
【问题描述】:

我的教授有一个有趣的练习要解决。但我需要一点帮助,以免在假期变得无聊。

练习是为了

  • 创建一个多线程负载平衡器,每秒从 5 个传感器读取 1 个测量点。 (因此每秒有 5 个值)。
  • 然后使用这些值进行一些“复杂”计算。
  • 在屏幕上打印计算结果。 (如传感器1-5的最大值或平均值等,当然是多线程的)
  • 作为一项附加任务,我还必须确保如果将来每秒读取 500 个传感器,计算机不会退出工作。(负载平衡)。

我有一个 csv 文本文件,其中包含来自 5 个假想传感器的约 400 个测量点。

我认为我必须做的:

  1. 将测量点读入数组
  2. 确保对该数组的线程安全访问
  3. 为每个计算一些数学内容的值生成一个新线程
  4. 设置最大并发工作线程的最大值

我是 c# 中的多线程应用程序的新手,但我认为使用线程池是正确的方法。我目前正在处理一个队列,并且可能在一个任务中启动它,这样它就不会阻塞应用程序。

你会推荐什么?

【问题讨论】:

  • 您是否打算独立计算每个传感器的最大值、平均值?
  • 是的,这就是“设计”。它应该随着传感器的增加以某种方式扩展,但不应该杀死处理器......
  • 或更重要的是:不应该杀死应用程序及其功能
  • 模拟电脑取胜。

标签: c# multithreading load-balancing


【解决方案1】:

这里有几个环境依赖:

  • 您使用的是什么版本的 .NET?
  • 您使用的是什么 UI - 桌面 (WPF/WinForms) 或 ASP.NET?

假设它是 .NET 4.0 或更高版本并且是一个桌面应用程序。

读取传感器

在 WPF 或 WinForms 应用程序中,我将使用单个 BackgroundWorker 从传感器读取数据。每秒 500 次读取是微不足道的 - 即使 500,00 通常也是微不足道的。而且 BackgroundWorker 类型是专门为与桌面应用程序交互而设计的,例如将结果传递给 UI 而无需担心线程交互。

处理计算

然后您需要处理“复杂”的计算。这取决于这些计算的寿命。如果我们假设它们是短暂的(比如每个不到 1 秒),那么我认为使用 TaskScheduler 和标准 ThreadPool 就可以了。因此,您为每个计算创建一个Task,然后让 TaskScheduler 负责将任务分配给线程。

TaskScheduler 的工作是通过将轻量级任务排队到更重量级的线程来平衡工作负载,并管理 ThreadPool 以最佳地平衡工作负载与机器上的内核数量。您甚至可以override the default TaskScheduler 以您想要的任何方式安排任务。

ThreadPool 是需要处理的工作项的 FIFO 队列。在 .NET 4.0 中,ThreadPool 通过使工作队列成为线程安全的ConcurrentQueue 集合来提高性能。

衡量任务吞吐量和效率

您可以使用PerformanceCounter 来测量CPU and memory usage。这将使您对内核和内存是否得到有效使用有一个很好的了解。任务吞吐量仅通过查看任务处理和提供结果的速率来衡量。

请注意,我没有在此处包含任何代码,因为我假设您想为您的教授处理实现细节:-)

【讨论】:

  • 嗨,感谢您的帮助。这是一个概念证明,我可以选择我想要的任何东西。所以 c# .net 4 winforms 是我现在正在使用的东西....
  • 我想我解释得不对……每秒读取的次数并不重要,重要的是每个传感器每秒至少读取一次。所以每秒一次就可以了....在用任务杀死系统之前可能会更好
  • 读取所有传感器并更新 UI 可以在单个线程上完成 - 在本例中使用 Backgroundworker。它只是需要以并行(多线程)方式完成的“复杂”处理。
  • @michael_j 您还应该看看“任务并行库”。这可以使用对数组进行分区并对数组进行并行处理来完成。但是再次使用将取决于您的要求。但它是一个寻找和开始的好地方。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多