我有两个不需要太多计算的IO密集型进程:一个是获取并解析网页,另一个是将通过解析获得的一些数据存储在数据库中。在网络抓取继续进行的同时,这将会重复。动态优化线程数
是否有一种方法可以动态地增加和减少在每个任务上工作的线程数,因此对于整个系统运行的机器来说性能是最佳的?该方法不应涉及基准测试,因为它将被分发到许多我事先无法访问的机器。
请引导我一些来源或信息。
我有两个不需要太多计算的IO密集型进程:一个是获取并解析网页,另一个是将通过解析获得的一些数据存储在数据库中。在网络抓取继续进行的同时,这将会重复。动态优化线程数
是否有一种方法可以动态地增加和减少在每个任务上工作的线程数,因此对于整个系统运行的机器来说性能是最佳的?该方法不应涉及基准测试,因为它将被分发到许多我事先无法访问的机器。
请引导我一些来源或信息。
不是直接使用线程,而应该创建一个ThreadPool
,并在其中添加一些Runnable
,它们可以完成实际的工作。根据您的描述,CachedThreadPool可能是合适的。查看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html了解如何实施的一些指导原则。
那么动态调整线程数应该没有问题(例如使用ThreadPoolExecutor)。
但它看起来对我来说,最佳线程数是由两个因素的限制:
我不确定下载部分是否应该是多线程的,因为每个线程只会从其他线程窃取带宽,除非页面非常小。
一些指南http://parsec.cs.princeton.edu/publications/iiswc62-pusukuri.pdf –
使用* ['FixedThreadPool'](http://docs.oracle.com/javase/7/docs/api /java/util/concurrent/Executors.html#newFixedThreadPool%28int%29)*,其他部分参见* [this](http://stackoverflow.com/questions/1980832/java-how-to-scale-threads -according-to-cpu-cores)* post。 –