2013-06-28 8 views
0

Я использую miltiprocessing, чтобы читать много кусков огромного файла, а затем обрабатывать его, но я что-то теряю, потому что иногда, когда я запускаю какой-то процесс, некоторые из них разделяют ядро. Пример: система с 12 ядрами, я запускаю 10 процессов и 6 - 6 ядер (по одному с каждым), а другие 4 - 2 ядра (по 2 в каждом ядре) ... но в других случаях он отлично работает с использованием 10 ядер на 10 процесс ...Python многопроцессорность делится ядрами

код:

from multiprocessing import Process 
[...] 
process1=Process(target=run_thread, args=("./splited/"+file,result,)) 
process2=Process(target=run_thread, args=("./splited/"+file,result,)) 
process3=Process(target=run_thread, args=("./splited/"+file,result,)) 
process1.start() 
process2.start() 
process3.start() 
[...] 
process1.join() 
process2.join() 
process3.join() 

Это пример моего кода, я пытался с 10, когда я увидел этот вопрос.

Спасибо.

Редакцией:

  • Эта машина работает без многопоточных, поэтому он имеет 12 ядер с максимум 12 параллельных потоков.
  • Иногда бывает более двух человек, использующих ядро.
  • Шея бутылки не является IO на этой программе, она обрабатывает каждую строку файла.
+0

Вы действительно хотите многопроцессорную обработку? Параллелизация будет только покупать вам прирост производительности для операций, которые на самом деле являются процессорами. Это не поможет вам с узкими местами ввода-вывода. –

ответ

0

Я, конечно, не эксперт по этому вопросу, но, по-видимому, большинство современных процессоров структурированы с физическими ядрами и виртуальными ядрами. Например, у меня есть Intel Core I7, что означает, что у меня есть 4 физических ядра, но каждый из них фактически содержит 2 виртуальных ядра, что означает, что мой процессор может одновременно запускать 8 различных процессов.

Вы упоминаете, что иногда у вас есть 2 процесса на ядро, поэтому это связано с базовой виртуализацией.

Кстати, если вы нацелены на обработку больших объемов данных в более мелких кусках, есть специальный модуль в питоне, посвященный такие задачи: Pool, что импортируется с помощью

from multiprocessing import Pool 

Надеется, что это полезно к вам, Cheers

+0

Спасибо за ваш ответ. Это не ошибка, на этом сервере отключено многопоточность (так что только 12 потоков одновременно с 2-мя процессорами exa-core), и в последний раз, когда я пытаюсь, было 3 процесса на одном процессоре, 2 в других, а остальные один за другим. – user2533536