Skip to main content
 首页 » 编程设计

python之检查数千个 url 的最快方法是什么

2025年05月04日18TianFang

我需要检查至少 20k 个 url 以检查 url 是否可用并将一些数据保存在数据库中。

我已经知道如何检查一个 url 是否在线以及如何在数据库中保存一些数据。但是如果没有并发,检查所有 url 将需要很长时间,那么检查数千个 url 的最快方法是什么?

我正在学习本教程:https://realpython.com/python-concurrency/似乎“CPU 绑定(bind)多处理版本”是最快的方法,但我想知道这是否是最快的方法,或者是否有更好的选择。

编辑:

根据回复,我将更新比较多处理和多线程的帖子

示例 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%

谢谢你的帮助

请您参考如下方法:

说多处理始终是最佳选择是不正确的,多处理仅适用于繁重的计算!

对于不需要大量计算但仅需要 IN/OUT 操作(如数据库请求或远程 webapp api 请求)的操作,最佳选择是模块线程。线程可以比多处理更快,因为多处理需要序列化数据以将其发送到子进程,同时 trheads 使用相同的内存堆栈。

Threading module

案例中的典型事件是创建输入队列。队列并放置任务(您案例中的 url)并创建多个工作人员以从队列中获取任务:

import threading as thr 
from queue import Queue 
 
 
def work(input_q): 
    """the function take task from input_q and print or return with some code changes (if you want)""" 
    while True: 
        item = input_q.get() 
        if item == "STOP": 
            break 
 
        # else do some work here 
        print("some result") 
 
 
if __name__ == "__main__": 
    input_q = Queue() 
    urls = [...] 
    threads_number = 8 
    workers = [thr.Thread(target=work, args=(input_q,),) for i in range(threads_number)] 
    # start workers here 
    for w in workers: 
        w.start 
 
    # start delivering tasks to workers  
    for task in urls: 
        input_q.put(task) 
 
    # "poison pillow" for all workers to stop them: 
 
    for i in range(threads_number): 
        input_q.put("STOP") 
 
    # join all workers to main thread here: 
 
    for w in workers: 
        w.join 
 
    # show that main thread can continue 
 
    print("Job is done.")