gpt4 book ai didi

python - 我是否过度生成了 IO 绑定(bind)的网络抓取线程?

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

长话短说:如果我生成 10 个 Web 请求,每个请求都在自己的线程上,CPU 有 4 个线程限制,这是可以的还是低效的?线程是 IO 绑定(bind)的,因此在等待服务器响应时处于空闲状态(我相信)。如果超过4个线程同时返回,CPU如何处理?

我有一个脚本,当前为我需要通过 http.client.HTTPSConnection 下载的每个文件(每个文件都位于唯一的 URL)启动一个新线程。最多,我可能需要生成 730 个线程。我已经这样做了,因为线程都是 IO 绑定(bind)工作(下载并保存到文件),但我不确定它们是并行执行还是 CPU 一次只执行一组。文件大小介于 20MB 到 110MB 之间的总运行时间约为 15 分钟。

我的 CPU 是四核的,没有超线程。这意味着它在任何给定时间只能同时支持 4 个线程。由于工作受 IO 限制而不是 CPU 限制,我是否仍然受限于只有 4 个并发线程?

我想令人困惑的是,如果说我在 10 个线程上只发送 1 个请求,我不确定会发生什么事件;如果他们同时返回会怎样?或者 CPU 如何在移动到下一个可用线程之前选择完成哪 4 个线程?

在所有这一切之后,如果 CPU 一次只处理 4 个线程,我认为根据需要生成尽可能多的 IO 线程仍然是明智的(因为它们在等待服务器响应时会闲置)对吧?

最佳答案

在一个四核 CPU 上,您可以拥有多于 4 个 IO 绑定(bind)线程。但是,您确实希望有一些最大值。即使是 IO 绑定(bind)进程有时也会使用 CPU。例如,当收到一个数据包时,需要处理该数据包以更新 TCP 状态。如果您从套接字读取并写入文件,在大多数情况下,需要一些 CPU 将字符从套接字缓冲区实际复制到文件缓冲区。如果您使用 TLS,通常需要 CPU 来解密和加密数据。因此,即使是主要执行 IO 的线程也会使用一些 CPU。最终,您使用 CPU 的一小部分时间将加起来并消耗可用的 CPU 资源。另外请注意,在 Python 中,由于全局解释器锁,您一次只能有一个线程使用 CPU 来运行 Python 代码。因此,在执行诸如等待传出连接之类的操作时,通常不会保留 GIL。在此期间可以运行其他线程。但是,在从套接字或文件读取和写入时的某些时间段内,GIL 将被保留。对于最常见的工作负载,当您的线程需要一个 CPU 的时间部分达到一个完整的 CPU 而不是四个完整的 CPU 时,您的应用程序的性能可能会达到最大值。您可能会发现使用 asyncio 或其他一些事件驱动架构可提供更好的性能。如果为真,这通常是因为事件驱动模型更擅长减少资源的跨线程争用。针对您的问题编辑,我认为 10 个线程不会成为问题

关于python - 我是否过度生成了 IO 绑定(bind)的网络抓取线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44359336/

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