Процессы vs потоки в Java


В вопросах, которые я прочитал, мы предлагаем использовать потоки над процессами, потому что потоки быстрее. Я решил пойти с потоками для моей программы, которая редактирует статьи в категории В Википедии. Программа получает список статей для редактирования,а затем делит статьи между 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(...)
     }
} 
2   5   2014-08-16 21:20:21

2 ответа:

Каждый процесс имеет несколько потоков для выполнения своей работы. Если у вас есть один процесс с N потоками или N процессов с 1 потоком, это не имеет большого значения, за исключением.

  • нити имеют более легкий вес и немного меньше накладных расходов. Разница между ними составляет миллисекунды, так что вы вряд ли выиграете здесь.
  • используя больше процессов, косвенно позволяет вашей программе использовать больше памяти (поскольку каждый процесс имеет ограниченный размер кучи, вы можете изменить), если у вас будет N процессы, справедливое сравнение заключается в ограничении памяти каждого процесса до 1 / N-й части объема памяти.
  • более вероятно, что вы создаете узкое место на общем ресурсе, например блокировку. Это означает, что вы добавляете мало или вообще ничего не добавляете, так как ваша программа не может использовать их эффективно. Используя несколько процессов, вы разрываете связь между потоками.

Я вижу, что каждый процесс может делать 6-7 правок в минуту

Каждое редактирование 10 секунд-это довольно долго. Возможно, стоит оптимизировать код с помощью профилировщика ЦП, чтобы повысить производительность.

Во-первых, вы неправильно используете потоки. Потоки действительно являются исполняемыми, поэтому вы можете отправить их исполнителю, но они не будут выполняться как потоки. Исполнитель будет запускать методы run () в своих собственных потоках. Количество параллельного выполнения вашего кода выше зависит от исполнителя, которого вы используете.

Во-вторых, 6-7 правок в секунду на поток звучит подозрительно, я хотел бы верить, что возможно больше. Вы можете быть узким местом на общем ресурсе, как @PeterLawrey предполагая, что вы используете блокирующий ввод-вывод (или библиотека, которую вы используете, использует блокирующий ввод-вывод), в этом случае вы можете увеличить пропускную способность, увеличив количество потоков. Трудно сказать, с каким узким местом вы столкнулись без некоторых данных профилирования.