【问题标题】:Does multiprocessing speed up file transfers compared to multithreading与多线程相比,多处理是否加快了文件传输速度
【发布时间】:2018-09-28 05:48:39
【问题描述】:

我正在编写一个脚本,以使用套接字同时接受从子网上的多台计算机传输的许多文件(总共大约 40 个 jpg 文件)。我想使用多线程或多处理来尽可能快地进行传输。

我想知道这种类型的图像传输是否受到 CPU 的限制 - 因此我应该使用多处理 - 或者多线程在这里是否也一样好。

我也很好奇哪些类型的活动受 CPU 限制并需要多处理,哪些更适合多线程。

【问题讨论】:

    标签: python multithreading sockets multiprocessing


    【解决方案1】:

    如果以下假设成立:

    1. 您的脚本只是从网络接收数据并将该数据逐字写入磁盘(或多或少),即它不会对数据进行任何昂贵的处理
    2. 您的脚本在具有典型现代网络硬件(例如千兆以太网或更慢)的现代 CPU 上运行
    3. 您的脚本下载例程并不是非常低效(例如,您正在接收大小合理的数据块,而不是一次仅 1 个字节或类似的愚蠢行为)

    ...那么您的下载速率不太可能受 CPU 限制。瓶颈更有可能是网络带宽或磁盘 I/O 带宽。

    无论如何,由于 AFAICT 您的用例是令人尴尬的并行(即各种下载永远不必相互通信或交互,它们只是各自独立地做自己的事情),因此使用多线程与多处理不太可能使性能上有很大的不同。当然,唯一可以确定的方法是两种方式都尝试并测量每种方式的吞吐量。

    【讨论】:

      【解决方案2】:

      简答: 一般来说,这真的取决于你的工作量。如果你对性能很重视,请提供详细信息。例如,是否将图像存储到磁盘,图像大小是否 > 1GB 等等。

      注意:通常,如果它不是关键任务,两种方式都可以接受,因为我们可以使用 threading.Thread 和 multiprocessing.Process 在多线程和多进程实现之间轻松切换。

      更多的 cmets 看来瓶颈不是 CPU 而是 IO。

      对于多进程/多线程,由于 GIL 和/或您的实现,我们可能会有性能差异。您可以实现这两种方式并尝试。顺便说一句,恕我直言,它不会有太大差异。我认为异步 IO 与阻塞 IO 会产生更大的影响。

      【讨论】:

        【解决方案3】:

        如果您的文件传输不是非常慢 - 比将数据写入磁盘慢,那么多线程/多处理将无济于事。文件传输是指下载图像并使用单个 HDD 将它们写入本地计算机。

        在从多台具有不同磁盘的计算机传输数据时使用多线程或多处理绝对可以提高整体下载性能。只需从多个物理磁盘读取的数据可以并行读取。当您尝试将这些图像保存到本地驱动器时会出现问题。

        你只有一个本地硬盘(如果不使用磁盘阵列),像大多数硬件设备一样,单个硬盘一次只能执行一个 IO 操作。因此,尝试同时将多个图像写入磁盘不会提高整体性能 - 甚至会妨碍它。

        试想一下,40 个已下载的图像正试图写入单个机械 HDD,其中单个 HDD 磁头写入不同的位置(不同的物理文件),尤其是在磁盘碎片化的情况下。然后这甚至会减慢整个过程,因为 HDD 浪费时间将磁头从一个位置移动到不同位置(驱动器可以通过重新排序 IO 操作以限制磁头移动来部分缓解这种情况)。

        另一方面,如果您对这些 CPU 密集型图像进行预处理,然后将它们保存到磁盘,那么多线程会非常有用。

        对于什么是首选的问题。在现代操作系统上,使用多线程和多处理(跨越多个进程)之间没有显着差异。 Linux 或 Windows 等操作系统调度线程而不是进程 - 基于进程和线程优先级。所以40个单线程进程和单进程包含40个线程并没有太大区别。使用多个进程通常会消耗更多内存,因为每个进程的操作系统都必须分配一些额外的内存(不大),但从速度来看,多线程和多处理之间的差异并不显着。还有其他重要的问题要考虑使用哪种方法(这些下载是否会共享一些数据 - 像常见的 GUI 界面 - 多线程更易于使用),(这些文件要下载这么大以至于 40 次传输会耗尽所有虚拟地址空间吗?单进程 - 使用多进程)。

        一般:

        多线程 - 更易于在单个应用程序中使用,因为所有线程共享单个进程的虚拟地址空间,并且可以轻松地相互通信。另一方面,单个进程的虚拟地址空间大小有限(在 32 位计算机上小于 4GB)。

        多处理 - 更难在单个应用程序中使用(需要进程间通信),但更具可扩展性和更健壮(如果文件传输进程崩溃,只有单个文件传输失败)+ 更多虚拟地址空间可供使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-16
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 2012-08-14
          相关资源
          最近更新 更多