课后习题
在演示将单进程下载图片应用改为多进程下载图片应用时,我将多进程模型应用到了下载和保存文件两个函数中。请你根据今天所学的内容判断,如果将下载和文件保存两个函数分别放在两个进程池中,能否提高下载效率?请你通过代码实现并观察执行时间是否有变化。
课程代码、课件及其他相关资料地址
https://gitee.com/wilsonyin/zero-basics-python
作者回复: 多线程并不总是能提高性能,使用异步编程模型(例如使用 asyncio)可能是一个更好的选择。我简单列举几种多线程比单线程慢的原因给你做参考: GIL(全局解释器锁):CPython(Python的标准实现)有一个称为全局解释器锁(GIL)的机制,限制了多线程在CPU密集型任务中的并发执行。虽然I/O密集型任务(如文件下载)通常不受GIL的影响,但在某些情况下,GIL可能仍会产生影响。 线程管理开销:创建和管理多个线程会带来一定的开销。如果线程数量太多,这些开销可能会超过并发执行带来的性能提升。 网络带宽限制:如果你的网络带宽已经被单线程下载充分利用,那么增加更多的线程可能不会带来任何提速效果。反而,多线程之间的竞争可能会导致整体速度下降。 服务器限制:有些服务器可能对来自同一客户端的并发连接数量有限制。过多的线程可能会触发这些限制,导致连接被拒绝或速度下降。 磁盘I/O限制:如果下载的文件直接写入磁盘,磁盘的I/O速度可能会成为瓶颈。多线程同时写入可能会增加I/O等待时间。 错误的线程数量选择:选择合适的线程数量是一个复杂的问题,太少或太多的线程都可能不是最优选择。一个通常的做法是基于系统的核心数量和任务类型来选择线程数量。 代码实现问题:如果多线程的实现有同步问题、死锁、资源竞争等,这也可能导致性能下降。
作者回复: 单进程池比双进程池运行时间快,这种情况是有可能出现的,首先进程并不像看上去那样,从进程开始到执行结束,一直占用CPU,一旦出现资源不足,操作系统会自动将当前进程的“作案现场”保留下来,切换到其他进程,而当前进程资源满足以后,又要切换回来,因此会出现多进程比单进程慢的情况,甚至有可能出现进程开启的数量越多越慢的场景。我只是列举了一个比较容易出现的情况,这也是程序员比较考验对系统的理解和编程能力的地方