繁体   English   中英

使用来自多处理的池时出现 TypeError(python 3.7)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM