gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:48 25 4
gpt4 key购买 nike

我需要检查至少 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.")

关于python - 检查数千个 url 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com