Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何充分利用多处理器?_Java_Multithreading_Web Crawler_Multiprocessing - Fatal编程技术网

Java 如何充分利用多处理器?

Java 如何充分利用多处理器?,java,multithreading,web-crawler,multiprocessing,Java,Multithreading,Web Crawler,Multiprocessing,我正在使用Java在一个有32个虚拟处理器的服务器上进行web爬行。如何充分利用这些处理器?我看到了一些关于多线程编程的建议,但我想知道如何确保所有处理器都能得到利用,因为我们也可以在单处理器机器上进行多线程编程。对此没有简单的答案。。。但确保使用所有处理器的方法是正确使用多线程。(注意:这是一个循环回答!) 基本上,有效使用多处理器的方法是: 确保有可以并行完成的工作,以及 减少/消除强制一个线程等待另一个线程执行某些操作的争用点 当你做简单的计算时,这已经足够困难了。对于一个网络爬虫,你

我正在使用Java在一个有32个虚拟处理器的服务器上进行web爬行。如何充分利用这些处理器?我看到了一些关于多线程编程的建议,但我想知道如何确保所有处理器都能得到利用,因为我们也可以在单处理器机器上进行多线程编程。

对此没有简单的答案。。。但确保使用所有处理器的方法是正确使用多线程。(注意:这是一个循环回答!)

基本上,有效使用多处理器的方法是:

  • 确保有可以并行完成的工作,以及
  • 减少/消除强制一个线程等待另一个线程执行某些操作的争用点
当你做简单的计算时,这已经足够困难了。对于一个网络爬虫,你会遇到额外的问题,线程将竞争网络和(可能)删除服务器带宽,他们通常会试图将结果放入共享数据结构或数据库中

这就是在这个普遍性的层面上所能说的一切


正如@veer正确指出的那样,您无法“确保”它


。。。但是使用线程负载肯定会更快,因为所有糟糕的网络延迟都将并行发生


实际上,如果您做得太过火,线程负载会因为争用而降低吞吐量。仅仅在问题上抛出大量线程很少是一个好主意。

一台计算机或一个程序的速度仅与其处理链中最慢的一个环节相同。仅仅增加CPU容量并不能确保达到一个剧烈的性能峰值。撇开缓存大小、RAM等其他问题不谈,对于如何利用所有处理器的问题,有两种基本方法:

[1] 使用Jit/即时编译器/解释器技术,如Java/.NET。我对java了解不多,但.NET抖动的设计绝对是为了利用mahcine上所有可用的处理器。事实上,正是这一特性使jitter相对于其他静态语言编译器(如C/C++)脱颖而出,因为jitter“知道”它位于32个处理器上,因此它比在任何其他机器上静态编译的程序更好地利用它们。(前提是您已经为其编写了健壮的多线程代码!)

[2] 用C/C++编程。这是经典的方法。如果您在具有32个CPU的同一台机器上编译代码,并在程序中采取适当的措施,如内存管理、处理指针等,那么C/C++程序将是最佳的,并且将比其CLR/JVM对应程序执行得更好(因为它在运行时没有垃圾收集器或VM的额外开销)


但是请记住,在.NET/Java中编写健壮的代码要比在C/C++中容易得多。所以,如果你不是一个“硬核”程序员,我建议你使用前一种方法。还要记住小心处理多个线程,例如当多个线程试图更改相同的变量时锁定变量。但是,如果变量的行为意外,过度锁定可能会使代码挂起。

处理器管理是通过您正在使用的虚拟机(即JVM)在本机中实现的。如果您使用的是JavaHotspot虚拟机,您可以在这里查看以优化您的机器。如果您使用的是第三方VM,那么您的提供商可能会帮助您根据您的需求对其进行调优

设计中的应用程序性能实际上取决于您。 如果您希望监视线程和内存使用情况以优化应用程序,则可以使用迄今为止可用的任何VM监视工具。Java虚拟机(JVM)具有内置的工具,使您能够使用JMX监视和管理它。
有关详细信息,您可以查看。对于第三方虚拟机,我想您必须联系供应商。

单处理器机器上的多线程除了填充IO操作发生的时间(一个用于阻止IO操作的线程,另一个用于响应用户的线程)之外没有任何影响。对于多处理器,如果您有一个任务,并将其拆分为多个处理器来处理,那么让多个处理器同时工作会更快。+1解析网页中的链接是CPU密集型的,但相当简单和快速。DNS查找和获取页面的速度非常慢。我非常怀疑OP是否能够使用100%的CPU,但使用线程负载肯定会更快,因为所有糟糕的网络延迟都将并行发生(假设,如您所说,O/P得到了有效处理—分块文件写入、DB批插入等)。