为什么 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
也一样。
我有以下方法作为 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
也一样。