我正处于一个问题中,我无法决定采取哪种解决方案。线程池vs许多单线程
这个问题有点独特。让我们这样说,我从网络上不断接收数据(每秒2到4次)。现在每个数据都属于不同的组,比如说。 现在,我们称这些组,group1,group2等。
每个组都有一个专门的作业队列,来自网络的数据将被过滤并添加到其相应的组中进行处理。
起初,我为每个组创建了一个专用线程,它将从作业队列获取数据,对其进行处理,然后进入阻塞状态(使用链接阻塞队列)。
但是我的高级建议我应该使用线程池,因为这种方式线程不会被阻塞,并且可以被其他组用于处理。
但是,事情就是这样,数据即时获取速度足够快,并且线程处理它的时间足以让线程可能不会进入阻塞模式。这也将保证数据按顺序进行处理(作业1在作业2之前完成),这在池中很少有机会可能不会发生。
我的老人也倾向于这样的事实,因为线程是POOLED(即时通讯认为他真的是这个词;)),汇集也将节省我们大量的内存。虽然我不同意这一点,因为我个人认为,汇集或不是每个线程都有自己的堆栈内存。除非线程池中有某些我不知道的东西。
最后一件事,我一直认为集合有助于短时间内在大量工作中出现工作。这是有道理的,因为线程产生将是一个性能杀手,因为初始化一个线程所花费的时间比做这项工作花费的时间多得多。所以在这里汇集有很多帮助。
但在我的情况下,group1,group2,...,groupN总是保持活着。所以如果有数据,他们仍然会在那里。所以线程产卵在这里不是问题。
我的老人不服气,希望我使用pooling解决方案,因为它的内存占用很大。
那么,采取哪条路?
谢谢。
在这样的情况下,只有一个答案。冷酷的事实!通过适当的受控模型/原型证明哪个更好。您可能会感到惊讶,因为在不同的情况下,每个人都可能有效。 – 2012-07-28 11:59:18
需要CYA备忘录 - 通过电子邮件详细说明您的问题/疑虑,然后按照老年人的建议使用合并解决方案。如果集中设计存在问题,则屏蔽:)。看看你的需求,我可能会用一组专用的线程 - 这些线程只在启动时创建,并且一个线程比一个异步的状态引擎更容易调试,而这个状态引擎必须在需要做的事情时不断发布到池中。如果线程池没有使用异步方法,则任何阻塞调用都会阻塞池线程,从而迫使系统创建更多线程:( – 2012-07-28 12:42:25
如果您的应用程序为每个组创建一个线程,并且每个线程从自己的队列中获取数据,并且无限地运行,你实际上拥有一个固定的线程池,创建一个具有相同线程数量的“真实”线程池不会有太大的改变,使用“真实”线程池可以获得的好处是只需少量线程从所有队列中选择数据,并且如果线程池队列中等待的任务太多,或者线程太多,空闲线程池可能会根据需要增长和缩小。 – 2012-07-28 13:24:53