Python 3.4 多进程抛出 TypeError("无法序列化 '_io.BufferedReader' 对象",)

Jam*_*Guo 5 multiprocessing typeerror python-3.4

最近我用Python 3.4编写了一个多进程代码来下载一些图像,一开始它运行得非常快,然后我收到以下错误并且无法再启动程序。

Traceback (most recent call last):
  File "multiprocessing_d.py", line 23, in <module>
    main()
  File "multiprocessing_d.py", line 16, in main
    p.map(download, lines)
  File "/usr/local/lib/python3.4/multiprocessing/pool.py", line 260, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/local/lib/python3.4/multiprocessing/pool.py", line 608, in get
    raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool.ExceptionWithTraceback object at 0x7f1e047f32e8>'. Reason: 'TypeError("cannot serialize '_io.BufferedReader' object",)'
Run Code Online (Sandbox Code Playgroud)

我的代码如下
download_helper.py

        import sys
        import os
        from pathlib import Path

        url_prefix = r"Some prefix"

        def setup_download_dir(dictionary):
            download_dir = Path(dictionary)
            if not download_dir.exists():
                download_dir.mkdir()
            return dictionary

        def download_link(dictionary, line):
            from urllib.request import urlretrieve
            itemid = line.split()[0].decode()
            link = line.split()[1].decode()
            if (link.startswith("http")):
                image_url = link
            else:
                image_url = url_prefix + link
            if os.path.isfile(dictionary + "/" + itemid + ".jpg"):
                #print("Already have " + itemid + ".jpg")
                pass
            else:
                urlretrieve(image_url, dictionary + "/" + itemid + ".jpg")
Run Code Online (Sandbox Code Playgroud)

多处理_d.py

        from functools import partial
        from multiprocessing.pool import Pool
        import sys
        from time import time
        from download_helper import setup_download_dir, download_link

        def main():
            file_path = sys.argv[1]
            dic_path = sys.argv[2]
            download_dir = setup_download_dir(dic_path)
            download = partial(download_link, download_dir)
            with open(file_path, 'rb') as f:
                lines = f.readlines()
                ts = time()
                p = Pool(processes=16, maxtasksperchild=1)
                p.map(download, lines)
                p.close()
                p.join()
                print('Took {}s'.format(time() - ts))
                f.close()

        if __name__ == "__main__":
            main()
Run Code Online (Sandbox Code Playgroud)

我尝试在网上搜索,但没有找到太多有用的信息。我怀疑 urlretrieve 中可能会引发一些异常,但我不知道如何调试它。任何意见或建议将不胜感激!

詹姆士