首页 > 解决方案 > 为什么 ProcessPoolExecutor 在我的代码中不起作用?

问题描述

我有以下方法作为类的一部分:

def download_page(self, page: namedtuple):
    r = requests.get(page.link)
    r.raise_for_status()
    with open(f'{page.number}.jpg', 'wb') as f:
        f.write(r.content)

def download_chapter(self, chapter: namedtuple):
    try:
        os.mkdir(chapter.name)
    except FileExistsError:
        print("This folder already exists. It will be overwritten.")
    os.chdir(chapter.name)

    page_list = self.get_pages(chapter.link)

    with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executor:
        executor.map(self.download_page, page_list)

    os.chdir('..')

问题是当我从我的主文件中调用 download_chapters() 函数时,所有目录都被创建但它们是空的。执行程序运行时应该保存的实际图像无处可见。此外,整个事情结束得非常快,所以我猜执行者根本没有工作。我有其他脚本以非常相似的方式使用 ProcessPoolExecutor 函数并且它按预期工作,所以我不知道我错过了什么。

另外,如果我用这个替换执行器部分:

for _ in page_list:
    self.download_page(_)

一切正常,所以我的其他功能正在做他们的工作。

标签: pythonmultiprocessingconcurrent.futures

解决方案


executor.map()返回一个迭代器

您需要以某种方式对其进行迭代才能使其正常工作;如果您不需要结果,只需

list(executor.map(self.download_page, page_list))

创建一个结果列表并随后丢弃。

如果您不想收集Nones 列表,

for _ in executor.map(self.download_page, page_list):
    pass

也一样。


推荐阅读