在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