[英]TypeError while using Pool from multiprocessing (python 3.7)
我试图总结一个目录中所有文件的大小,包括递归子目录。 如果我只调用一次,相关的 function ( self._count
) 工作得很好。 但是对于大量文件,我想使用multiprocessing
来使程序更快。 以下是代码的相关部分。
self._sum_dict
将给定字典的相同键的值相加。
self._get_file_type
返回文件应放置的类别( stats
的键)。
self._categories
包含所有可能类别的列表。
number_of_threats
指定应使用的工人数量。
path
保存第一句中所指目录的路径。
import os
from multiprocessing import Pool
def _count(self, path):
stats = dict.fromkeys(self._categories, 0)
try:
dir_list = os.listdir(path)
except:
# I do some warning here, but removed it for SSCCE
return stats
for element in dir_list:
new_path = os.path.join(path, element)
if os.path.isdir(new_path):
add_stats = self._count(new_path)
stats = self._sum_dicts([stats, add_stats])
else:
file_type = self._get_file_type(element)
try:
size = os.path.getsize(new_path)
except Exception as e:
# I do some warning here, but removed it for SSCCE
continue
stats[file_type] += size
return stats
files = []
dirs = []
for e in dir_list:
new_name = os.path.join(path, e)
if os.path.isdir(new_name):
dirs.append(new_name)
else:
files.append(new_name)
with Pool(processes=number_of_threats) as pool:
res = pool.map(self._count, dirs)
self._stats = self._sum_dicts(res)
我知道,此代码不会考虑path
中的文件,但这是我可以轻松添加的内容。 执行代码时出现以下异常。
Exception has occurred: TypeError
cannot serialize '_io.TextIOWrapper' object
...
line ... in ...
res = pool.map(self._count, dirs)
我发现,在共享进程之间的资源时可能会发生此异常,据我所知,我只使用stats = dict.fromkeys(self._categories, 0)
。 但是用硬编码值替换这一行并不能解决问题。 即使在这一行放置一个断点也无济于事,因为它没有达到。
有谁知道这个问题的原因是什么以及我该如何解决这个问题?
问题是你试图传递“自我”。 如果 self 有一个 Stream object 它不能被序列化。
尝试将多处理代码移到 class 之外。
Python 多处理启动一个新的解释器,如果您尝试访问无法腌制(或序列化)的共享代码,它会失败。 通常它不会在您认为它崩溃的地方崩溃……但是在尝试接收 object 时。 我将使用线程的代码转换为多处理,即使我没有发送或使用这些对象,我也遇到了很多奇怪的错误,但我使用了它们的父级( self )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.