我在为异步队列使用者线程组合算法时遇到了一些麻烦,即从单个队列中读取需要调度以执行长时间运行(至少几秒)工作的项目。
基本上,队列可以如下所示:A,A,A,A,A,B,B,A,B,A,A,A,A,A,C,B,A。
IE中。 A消息比其他消息更常见。
我们的系统针对每种不同的消息类型具有不同的并发值,例如我们一次只能执行3 x A消息,但我们可以一次执行5 x B和4 x C消息。
我当前(已损坏)的算法是从队列前面读取一个线程并将每个作业调度到线程池,每个作业的主体在执行实际有效负载之前等待足够的资源可用。 / p>
这意味着如果有足够的A消息首先到达,那么它们可以“填满”线程池的队列,并且B + C消息的饥饿时间比必要的时间长得多。
到目前为止,我已经考虑过为每种消息类型设置一个单独的线程池(类型数量相当少),但是我担心保持这么多线程的效率。
关于如何改进这方面的任何建议?
答案 0 :(得分:4)
为什么不让你的单一调度员调度到基于消息类型的单独队列。所以你总共有4个调度员,第一个向另外三个队列发送消息。
然后你有单独的队列读取器,它根据自己的规则将消息从队列中拉出。
答案 1 :(得分:0)
我不确定每种消息类型都有单独的线程池是不是很糟糕。你只需要这样做,看看会发生什么。
至于替代方案,您可以围绕线程池创建一个包装器并实现优先级队列(http://en.wikipedia.org/wiki/Priority_queue)。这种隐含性将为某些消息分配优先权。在您的情况下,由于C是最不常见的,它总是可以将C优先级更高。我想你明白了。
答案 2 :(得分:0)
首先,以下假设是否有效?
如果是这种情况,那么我认为这是作业车间调度问题的一个例子。我认为这些通常使用bin打包算法建模 - 对上述主题的谷歌搜索可以找到很多参考资料。
很可能是因为你的约束如此简单,背包打包算法更适合于垃圾箱打包,只需谷歌背包问题。