在Python中,多处理不是并行执行的

在Python中,多处理不是并行执行的,python,csv,multiprocessing,Python,Csv,Multiprocessing,我已经编辑了代码,目前运行良好。但认为它不是并行或动态执行的。谁能帮我查一下吗 代码: def folderStatistic(t): j, dir_name = t row = [] for content in dir_name.split(","): row.append(content) print(row) def get_directories(): import csv with open('CO

我已经编辑了代码,目前运行良好。但认为它不是并行或动态执行的。谁能帮我查一下吗

代码:

def folderStatistic(t):
    j, dir_name = t
    row = []
    for content in dir_name.split(","):
        row.append(content)
    print(row)

def get_directories():
    import csv
    with open('CONFIG.csv', 'r') as file:
        reader = csv.reader(file,delimiter = '\t')
        return [col for row in reader for col in row]

def folderstatsMain():
    freeze_support()
    start = time.time()
    pool = Pool()
    worker = partial(folderStatistic)
    pool.map(worker, enumerate(get_directories()))

def datatobechecked():
    try:
        folderstatsMain()
    except Exception as e:
        # pass
        print(e)

if __name__ == '__main__':
    datatobechecked()
Config.CSV

C:\USERS, .CSV
C:\WINDOWS , .PDF
etc.

config.csv中可能有大约200个文件夹路径

欢迎来到StackOverflow和Python编程世界

继续讨论这个问题。 在
get_directories()
函数中,您可以使用
上下文在
中打开文件,获取
读卡器
对象,并在离开上下文后立即关闭文件,以便在使用读卡器对象时,文件已经关闭

我不想让你气馁,但如果你对编程非常陌生,现在还不要涉足并行编程。随着您添加的每个线程的增加,同时处理多个线程的难度呈指数增长(尽管池大大简化了此过程)。进程甚至更糟糕,因为它们不共享内存,也不能轻松地相互通信

我的建议是,首先尝试将其编写为单线程程序。如果您让它工作并且仍然需要对它进行并行化,请隔离一个函数,将输入文件路径作为完成所有工作的参数,然后在该函数上使用线程/进程池

编辑:
根据我从代码中了解到的情况,您可以从CSV文件中获得目录名,然后针对并行运行的文件中的每个“单元格”
folderStatistics
。这部分似乎是正确的。问题可能出在
dir\u name.split(“,”
),请注意,您将单个“单元格”传递给
folderStatistics
而不是行。什么使您认为它没有并行运行?

欢迎来到StackOverflow和Python编程世界

继续讨论这个问题。 在
get_directories()
函数中,您可以使用
上下文在
中打开文件,获取
读卡器
对象,并在离开上下文后立即关闭文件,以便在使用读卡器对象时,文件已经关闭

我不想让你气馁,但如果你对编程非常陌生,现在还不要涉足并行编程。随着您添加的每个线程的增加,同时处理多个线程的难度呈指数增长(尽管池大大简化了此过程)。进程甚至更糟糕,因为它们不共享内存,也不能轻松地相互通信

我的建议是,首先尝试将其编写为单线程程序。如果您让它工作并且仍然需要对它进行并行化,请隔离一个函数,将输入文件路径作为完成所有工作的参数,然后在该函数上使用线程/进程池

编辑:
根据我从代码中了解到的情况,您可以从CSV文件中获得目录名,然后针对并行运行的文件中的每个“单元格”
folderStatistics
。这部分似乎是正确的。问题可能出在
dir\u name.split(“,”
),请注意,您将单个“单元格”传递给
folderStatistics
而不是行。是什么让您认为它没有并行运行?

创建多处理池会有一定的开销,因为创建进程与创建线程不同,是一项成本相当高的操作。然后,这些提交的任务(由传递给
map
方法的iterable的每个元素表示)被收集在“块”中,并写入由池进程读取的任务的多处理队列。这些数据必须从一个地址空间移动到另一个地址空间,这会带来成本。最后,当辅助函数
folderStatistic
返回其结果(在本例中为
None
)时,必须将数据从一个进程的地址空间移回主进程的地址空间,这也会带来相关的成本

当您的辅助功能足够CPU密集时,所有这些增加的成本都是值得的,因此与并行运行任务所节省的成本相比,这些额外的成本很小。但是您的辅助函数的CPU需求非常小,因此无法从多处理中获得任何好处

这里是一个比较调用辅助函数的单处理时间和多处理时间的演示,两次调用辅助函数,
fn
,第一次只执行其内部循环10次(低CPU要求),第二次执行其内部循环1000000次(高CPU要求)。您可以看到,在第一种情况下,多处理版本的运行速度相当慢(您甚至无法测量单个处理运行的时间)。但是,当我们使
fn
的CPU密集度更高时,多处理比单一处理获得了收益

来自多处理导入池的

从functools导入部分
导入时间
def fn(迭代次数,x):
求和=x
对于范围内的(迭代):
_和+=x
退还金额
#Windows需要:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
对于(10,1_000_000)中的n_迭代:
#单次处理时间:
t1=时间。时间()
对于范围(1,20)内的x:
fn(n_迭代,x)
t2=时间。时间()
#多处理时间:
工人=部分(fn,n_迭代)
t3=时间。时间()
将Pool()作为p:
结果=p.map(工人,范围(1,20))
t4=时间。时间()
打印(f'#迭代次数={n_迭代次数},单处理时间={t2-t1},多处理时间={t4-t3})
印刷品:

#iterations = 10, single processing time = 0.0, multiprocessing time = 0.35399389266967773
#iterations = 1000000, single processing time = 1.182999849319458, multiprocessing time = 0.5530076026916504
但即使池大小为8,由于固定的多处理开销,运行时间也不会减少8倍(更像是2倍)。当我将第二种情况的迭代次数更改为100000000次(甚至更多CPU密集型)时,我们得到

#iterations = 100000000, single processing time = 109.3077495098114, multiprocessing time = 27.202054023742676
。。。这意味着运行时间减少了4倍(我的计算机中运行着许多其他进程,因此存在对CPU的竞争)。

有一个ce