在我读过的问题中,我们建议使用线程而不是进程,因为线程更快。我决定为我的程序使用线程来编辑维基百科中某个类别中的文章。
该程序获取要编辑的文章列表,然后将文章分配给 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(...)
}
}
每个进程都有许多线程来完成其工作。如果你有一个带有 N 个线程的进程或 N 个带有 1 个线程的进程,则没有什么区别。
- 线程的重量更轻,并且开销也稍微少一些。它们造成的差异以毫秒为单位,因此您不太可能在这里获益。
- 使用更多进程,间接允许您的程序使用更多内存(因为每个进程都有有限的堆大小,您可以更改)如果您将有 N 个进程,公平的比较是将每个进程的内存限制为 1/N的内存量。
- 更有可能发生的情况是,您在共享资源(如锁)上遇到了瓶颈。这意味着额外的线程几乎没有增加任何价值,因为您的程序无法有效地使用它们。通过使用多个进程,您可以断开线程之间的连接。
我看到每个进程每分钟可以进行 6-7 次编辑
每个编辑需要 10 秒,听起来相当长。也许值得使用 CPU 分析器来优化代码以提高性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)