在我读过的问题中,我们建议使用线程而不是进程,因为线程更快。我决定用线程来编辑维基百科中的文章。该程序获取要编辑的文章列表,然后将文章划分为10个线程。通过这个,我每分钟进行6-7次编辑,速度与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例提供一个要处理的类别时,我看到每个进程每分钟可以进行6-7次编辑(我用5个进程测试了这一点)。
为什么在我的情况下进程要快得多?为什么线程没有改变任何东西?
代码(不是仅仅为了有一个想法而完成的):
public static wiki = new Wiki();
public process(){
String[] articles = wiki.getArticles(category);
for(int i=0; i< 10; i++){
String[] part = getPart(articles, i, 10);
MyThread t = new MyThread(part);
list.add(t);
}
ExecutorService.invokeAll(list); //I'm not sure about the syntax of the function
}
public class MyThread extends Thread {
public String[] articles ;
public MyThread(String[] articles) {
this.articles = articles;
}
public void run() {
//some logic
wiki.edit(...)
}
} 发布于 2014-08-16 17:27:09
每个进程都有许多线程来完成它的工作。如果有一个进程有N个线程,或者N个进程有1个线程,那么除了一个线程之外,它几乎没有什么区别。
我看到每个进程每分钟可以进行6-7次编辑。
每次编辑10秒听起来都很长。也许有必要使用CPU分析器来优化您的代码以提高性能。
发布于 2014-08-18 13:22:58
首先,您不正确地使用线程。线程确实是可运行的,所以您可以将它们提交给执行器,但是它们不会以线程的形式运行。执行器将在它自己的线程上运行run()方法。以上代码的并行执行量取决于您正在使用的执行器。
其次,6-7每线程第二次编辑听起来有点可疑,我想相信更多是可能的。您可能会像@PeterLawrey所建议的那样在共享资源上遇到瓶颈,或者您可能正在使用阻塞IO (或者您使用的库正在使用阻塞IO),在这种情况下,您可以通过增加线程数量来提高吞吐量。如果没有一些分析数据,很难说您正面临什么样的瓶颈。
https://stackoverflow.com/questions/25342089
复制相似问题