【发布时间】:2020-11-03 03:21:40
【问题描述】:
我一直在使用 requests 和 multiprocessing.dummy 在 Python 中开发多线程图像抓取工具。
脚本运行良好,直到达到某个点。然后整个工作流程变得非常缓慢。此外,我越早体验到这一点,似乎使用的线程越多。
下载部分如下所示:
def download(URL):
try:
URL = URL.rstrip()
down = requests.get(URL, headers={'x-test2': 'true'})
# Download Images
except BaseException as e:
print("Error")
线程部分看起来像:
if __name__ == '__main__':
ThreadPool(20).map(download, URLlist)
所以我的问题是,是什么减慢了我的整个下载过程,因为网址很好,它应该像以前一样继续。有没有我遗漏的命令或者是我的线程部分的东西? (线程没有正确关闭...)
同样重要的是,这个问题不会出现在较小的 url 列表中。
(但这不应该是我下载的页面的请求限制问题,因为同时脚本正在运行并且在我在页面速度和可用性方面遇到 0 个问题之后)。这是为什么呢?
【问题讨论】:
-
您可以尝试偶尔关闭您的线程池并重新打开它。 Python mp.Pool() 有一个问题,如果你让池长时间/迭代打开,它会变慢。我不确定 ThreadPool,但可以尝试一下。
-
你有多少个 CPU 内核?拥有比 CPU 更多的线程可能会阻碍无济于事。您也无法使用 Python 线程获得真正的并行性,因为由于 CPython 的 GIL(全局解释器锁),一次只能运行一个线程运行 Python 代码。像这样的 I/O 绑定操作可能不会受到影响,但是使用
multiprocessing而不是threading模块,CPU 绑定操作会更好。 -
@MarkTolonen 我有 6 个核心,即使没有使用它们。我在多处理方面也遇到了同样的问题,但经过一些测试后,它似乎可以与
concurrent.futures'一起使用,除了高 CPU 使用率。 -
@bivouac0 你能解释一下如何存档吗?我是所有这些东西的初学者。
标签: python multithreading multiprocessing threadpool python-multiprocessing