Многопроцессорность в вопросах Python

1

Поэтому я новичок в многопроцессорной обработке и в основном просто пытаюсь понять это. Наконец, появилась простая небольшая программа для работы. По сути, я хочу, чтобы он открыл 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)
  • 0
    Создание и разветвление процесса занимает много времени. В сочетании с поставленной задачей - изменение определенного файла, к которому может обращаться только один процесс одновременно, - многопроцессорность не дает преимущества в этой ситуации и фактически снижает производительность.
  • 0
    AH! Да, я не думал о том, что файл может быть доступен только одному процессу за раз.
Показать ещё 1 комментарий
Теги:
multiprocessing

1 ответ

0
Лучший ответ

Одна из причин, по которой 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()

Проверьте эти файлы, также увеличьте диапазон, если хотите

Ещё вопросы

Сообщество Overcoder
Наверх
Меню