为什么 ProcessPoolExecutor 在我的代码中不起作用?

Why is ProcessPoolExecutor not working in my code?

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

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(_)

一切正常,所以我的其他功能正在发挥作用。

executor.map() returns an iterator.

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

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

创建一个结果列表,然后丢弃。

如果您不想收集 None 的列表,

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

也一样。