Поэтому я новичок в многопроцессорной обработке и в основном просто пытаюсь понять это. Наконец, появилась простая небольшая программа для работы. По сути, я хочу, чтобы он открыл CSV файл и добавил я в новую строку.
Я заработал. Странно, однако, медленнее многопроцессорно (по большому счету), чтобы не использовать многопроцессорность вообще.
Может кто-то объяснить это мне?
multiprocessing.py
import csv
import multiprocessing
def wrtCSV(i):
with open('test.csv', 'a') as newFile:
newFileWriter = csv.writer(newFile)
newFileWriter.writerow([str(i)])
if __name__ == '__main__':
jobs = []
for i in range(100000):
p = multiprocessing.Process(target=wrtCSV, args=(i,))
jobs.append(p)
p.start()
normal.py
import csv
def wrtCSV(i):
with open('test.csv', 'a') as newFile:
newFileWriter = csv.writer(newFile)
newFileWriter.writerow([str(i)])
if __name__ == '__main__':
for i in range(100000):
wrtCSV(i)
Одна из причин, по которой normal.py
может быть быстрее, может заключаться в том, что файл не доступен всем процессам одновременно (как указано в комментариях).
Также важно, чтобы вы использовали разные процессы только тогда, когда это было необходимо. Например, если вы хотите запустить глубокий классификатор обучения на 100 разных изображениях, если вы сделаете это обычным способом, потребуется время. Но если вы разделите задачу между процессами, вы заметите ускорение.
Поэтому я думаю, что вы должны использовать процессы только тогда, когда хотите, чтобы они выполняли тяжелую обработку (прямо сейчас вы просто пишете в одном файле). Поскольку каждый раз, когда вы используете multiprocessing.Process
, он запускает новый процесс (создается блок управления процессом, новый процесс наследует ресурсы, резервирует память для него, несколько дополнительных накладных расходов), а нерестование процесса - медленная процедура.
Если вы действительно хотите сравнить производительность двух, возможно, создайте отдельные файлы и выполните некоторые вычисления внутри цикла.
normal.py
import csv
def wrtCSV(i):
for j in range(100):
if (j**2 * j + i * (j-j) + (j*i) + 1): # lets do some redundant calculations for benchmarking
with open('test{}{}.csv'.format(i,j), 'a') as newFile: # make individual files so that OS doesn't lock them
newFileWriter = csv.writer(newFile)
newFileWriter.writerow([str(i)])
if __name__ == '__main__':
for i in range(100):
wrtCSV(i)
multiprocessing.py
import csv
import multiprocessing
def wrtCSV(i):
for j in range(100):
if (j**2 * j + i * (j-j) + (j*i) + 1): # lets do some redundant calculations for benchmarking
with open('test{}{}.csv'.format(j,i), 'a') as newFile: # make individual files so that OS doesn't lock them
newFileWriter = csv.writer(newFile)
newFileWriter.writerow([str(i)])
if __name__ == '__main__':
jobs = []
for i in range(100):
p = multiprocessing.Process(target=wrtCSV, args=(i,))
jobs.append(p)
p.start()
Проверьте эти файлы, также увеличьте диапазон, если хотите