1

我有一个队列不断被工作项目填满,这些项目需要及时处理 - 所以我们有许多不同的处理器等待接收正在处理的项目

这些子处理器中的每一个一次只能处理一组数据,并且需要将数据推送给它,所以这就是我考虑的方式

它开始于:

  1. 进程将项目插入队列
  2. 队列应该是唯一的 - 这样如果一个项目已经在队列中,它不应该被重新插入(我现在不确定 - 但我可能需要提高这样一个项目的优先级,在这种情况下队列可能不会工作)

我刚在想

  1. Dispatcher 为每个可用的处理器创建一个对象
  2. 开始循环:
  3. Dispatcher 检查队列中是否有要处理的项目
  4. Dispatcher 查找当前不工作的处理器
  5. Dispatcher 将工作项发送到空闲处理器
  6. 转到开始循环:

我的问题是,我如何管理处理器对象上的线程我正在考虑执行以下操作之一:

  1. 当处理器对象被调度程序触发时 - 创建一个线程并开始对其进行处理,当线程完成时让它死掉。- 明显的缺点:创建和杀死一堆线程(线程池会缓解这个问题吗?)
  2. 为将完成其工作的每个处理器创建一个专用线程,然后检查处理器对象以查看是否还有其他工作要做 - 明显缺点:50 个处理器意味着 50 个线程,并且同步可能会变得困难
  3. 可能有一种更简单的方法可以做到这一点

谢谢 编辑

我似乎一直不清楚 - 数据不必由所有处理器处理它可以由任何处理器处理 - 但是一旦处理器开始处理数据,我们不能向它发送任何新数据,直到它完成处理 - 同时新数据涌入队列,经理需要尽可能快地整理数据 -

所以循环又是这样

  1. Dispatcher 查看是否有可用的处理器以及队列中是否有要处理的项目
  2. Dispatcher 选择一个空闲的处理器并从队列中弹出顶部的数据并将其发送到该处理器进行处理
  3. 调度员稍等片刻,再次入池

在处理器端 - 数据被发送到外部系统(一个有点长的过程),处理器等待外部系统返回并存储处理过的数据 - 只有这样处理器才能使用,除了一组新的数据关闭队列的

4

1 回答 1

1

我设法完成类似队列管理系统的最简单方法是使用 C# 中的内置队列对象。

public volatile Queue<MessageObject> q = new Queue<MessageObject>();

现在必须将消息发送到每个线程,如果您真的不想处理同步,请锁定并弹出顶部对象。您可以假脱机线程,或使用 EventHandler。如果使用 EventHandler,则需要在两个线程上同步,但它应该更快。

lock(q) { 
    this.nextcommand = q.Pop();
}
于 2012-08-13T18:37:28.513 回答