编辑:这个问题可能适用于其他语言 - 背后的整体理论似乎主要是语言不可知的。但是,因为这将在JVM中运行,所以我确定JVM开销/线程与其他环境之间存在差异。为了澄清一点,我想主要的问题是哪个更适合可伸缩性:具有更小的线程可以更快地返回,以便为其他工作负载处理其他工作块,或尝试获取尽可能快地完成单个工作量?在这种情况下,工作负载是连续的,多线程无助于加速单个工作单元;它更希望提高整个系统的吞吐量(感谢Uri带领我澄清)。Java多线程 - 更少的线程或更少的线程做更多的线程?
我正在开发一个替换现有系统的系统;目前的系统负载相当沉重,所以我们已经知道替换需要高度可扩展性。它与几个外部进程进行通信,如电子邮件,其他服务,数据库等,我已经计划使它成为多线程来帮助扩展。我以前在多线程应用程序上工作过,没有任何性能/可伸缩性需求的高点,所以我没有太多经验来获得绝对最大的并发性。
我的问题是在线程之间分配工作的最好方法是什么?我在看两个不同的版本,一个为完整的工作流创建一个线程,另一个为每个单独的步骤创建一个线程,继续下一步(在新的/不同的线程中)步骤完成 - 可能使用NodeJS风格的回调系统,但不直接关注直接实现细节。
我不太了解多线程的基本细节 - 例如上下文切换等,所以我不知道多线程的开销是否会缩短每个线程的执行时间。一方面,与多线程相比,单线程模型似乎对单个工作流程来说是最快的;然而,它也会为整个工作流程绑定一个线程,而多线程会更短,并且会更快地返回池(至少我想)。
希望底层的概念很容易理解;这里是一个人为的伪代码示例,但:
// Single-thread approach
foo();
bar();
baz();
或者:
// Multiple Thread approach
Thread.run(foo);
when foo.isDone()
Thread.run(bar);
when bar.isDone()
Thread.run(baz);
UPDATE:完全忘了。我正在考虑多线程方法的原因是(可能错误地)认为,由于线程执行时间较短,因此它们可用于整个工作负载的其他实例。如果每个操作需要5秒钟,那么单线程版本会锁定一个线程15秒;多线程版本会锁定单个线程5秒钟,然后它可以用于另一个进程。
任何想法?如果在网页中有任何类似的内容,我甚至会喜欢这个链接 - 我想不出如何搜索这个(我为此责怪周一,但明天可能会是相同的)。
如果你分拆新主题只有有父线程等待子线程完成,究竟是你获得? – Powerlord
你是对的 - 我的意思是要覆盖,并完全跳过它。我会更新。 – MCory
如果您希望事情运行得更快,请将同步而不是顺序任务分解为单独的线程。 –