python - 为什么 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(_)
一切正常,所以我的其他功能正在做他们的工作。
解决方案
您需要以某种方式对其进行迭代才能使其正常工作;如果您不需要结果,只需
list(executor.map(self.download_page, page_list))
创建一个结果列表并随后丢弃。
如果您不想收集None
s 列表,
for _ in executor.map(self.download_page, page_list):
pass
也一样。
推荐阅读
- php - 如何修改此 PHP 代码以导出数组中的配置文件而不是单个对象?
- arrays - 用vba中其他数组的内容过滤二维数组的最快方法
- c++ - 给定整数 n,d,i [ n*d + (id) ]%n 等价于 [n + (id)]%n?(% c++ 取模)
- flutter - TextField & BLoC : 预填充字段
- scala - 如何在 Actor 的同一线程内获取 http.singleRequest(httpRequest) 的 Httpresponse?
- r - 导入文本文件时出现不需要的字符“â^”
- exception - SwiftUI - 领域:无法从中删除关键路径的观察者,因为它没有注册为观察者
- postgis - Geotools StreamingRenderer 点问题时使用 Simplefeaturecollection 而不是 Simplefeaturesource 使用 postgis 数据库
- mysql - MYSQL如何生成序列和使用distinct
- css - 我的网站在任何地方都能响应,但是在调整浏览器窗口大小时