Python问题中的多重处理

时间:2018-07-30 15:03:41

标签: python multiprocessing

因此,我是多处理领域的新手,而且大多只是想弄清楚它。终于有了一个简单的小程序。本质上,我希望它打开一个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)

1 个答案:

答案 0 :(得分: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()

检查这些文件,并根据需要增加范围