python - 检查数千个网址的最快方法是什么?
问题描述
我需要检查至少 20k url 以检查 url 是否已启动并将一些数据保存在数据库中。
我已经知道如何检查 url 是否在线以及如何在数据库中保存一些数据。但是如果没有并发,检查所有 url 需要很长时间,那么检查数千个 url 的最快方法是什么?
我正在关注本教程:https ://realpython.com/python-concurrency/似乎“CPU-Bound multiprocessing Version”是最快的方法,但我想知道这是最快的方法还是有更好的选择。
编辑:
根据回复,我将更新比较多处理和多线程的帖子
示例 1:打印“你好!” 40次
穿线
- 使用 1 个线程:20.152419090270996 秒
- 有 2 个线程:10.061403036117554 秒
- 有 4 个线程:5.040558815002441 秒
- 8个线程:2.515489101409912秒
8核多处理:
- 花了 3.1343798637390137 秒
如果你使用 8 个线程,线程会更好
示例2,我的问题中提出的问题:
经过多次测试,如果您使用超过 12 个线程,线程会更快。例如,如果您想测试 40 个 url,并且使用 40 个线程的线程,它将比 8 核的多处理快 50%
谢谢你的帮助
解决方案
我认为你应该使用 pool: pool docs
基于这里的一些结果:mp vs threading SO
我会说总是使用多处理。也许如果您希望您的请求需要很长时间才能解决,那么线程的上下文切换优势将克服多处理的蛮力
就像是
import multiprocessing as mp
urls=['google.com', 'yahoo.com']
with mp.Pool(mp.cpu_count()) as pool:
results=pool.map(fetch_data, urls)
编辑:为了解决关于一组子进程的评论,我已经展示了如何请求进程等于你的逻辑线程数