【问题标题】:Can this be viewed as an I/O bound task?这可以被视为 I/O 绑定任务吗?
【发布时间】:2020-09-03 14:40:58
【问题描述】:

假设您的计算机上有 4 个物理内核,并且假设没有超线程并且 python 版本是 3.2+(尽管我不确定这些额外信息是否对我的问题重要)。

如果我要打开一个包含 3 个子进程的池,因此每个子进程在执行一些 CPU 绑定任务时占用一个物理内核,并且如果我要从当前进程中打开 3 个线程(占用 4 个内核中的一个)操作系统在哪里运行,如果我要将 CPU 绑定的任务沿着多处理发送到 3 个子进程中的每一个,那么问题是这样的:

从当前管理线程的进程的角度来看(这些线程正在将任务推送到每个子进程并等待结果从这些子进程返回),这些CPU绑定任务是否可以视为I / O 绑定任务(从当前进程的角度来看),因为当前进程实际上并没有做任何工作?等效地,3个线程会进入睡眠状态,而3个子进程正在计算数字并占用3个核心,让最后一个核心闲置吗?

【问题讨论】:

    标签: multithreading io multiprocessing cpu


    【解决方案1】:

    3 个线程会进入休眠状态,而 3 个子进程正在计算数字并占用 3 个核心,让最后一个核心闲置吗?

    是的。我无法想象还会发生什么,您是否还有其他可能性?正如你所说,线程正在等待。

    在这种情况下,您可能可以让 4 个进程来处理 CPU 密集型任务。

    听起来你的问题很适合multiprocessing.Pool。在这种情况下请注意,如果您不指定要使用的进程数,则默认使用 CPU 内核数:

    processes 是要使用的工作进程数。如果processesNone,则使用os.cpu_count() 返回的数字。

    这是一个官方标志,表明使用与核心一样多的进程是一种正常做法。

    【讨论】:

    • 我想到的用例是我有多台计算机,一台主计算机和 9 个(例如)从属计算机,每台计算机都有 4 个(例如)CPU 内核。主计算机中有一个主进程将任务分配给与主计算机和所有从计算机中的每个 CPU 内核挂钩的子进程
    • 所以我将有 9 X 4(来自从属计算机)+ 3(来自主节点)可用的 CPU 内核来工作。最后一个进程将通过打开 39 个线程(或数百个,取决于配置)来分配工作
    • 但是由于这些工作可以被视为 I/O 绑定的任务,我可以随意打开尽可能多的线程...... GIL 将在 main 中的这些线程之间传递过程,我不会有太多的开销
    • @Jay 听起来你的主人已经有很多工作要做,并且在 CPU 密集型(可能是内存密集型)工作上使用它的所有内核并不是最好的主意,尤其是因为它只会增加可用 CPU 内核的一小部分。但最终知道的唯一方法是衡量。
    • 是“在 CPU 绑定(可能是内存密集型)工作上使用其所有内核不是最好的主意”绑定到主节点?因为您说“在这种情况下,您可能可以让 4 个进程来处理 CPU 密集型任务。”但是“特别是因为它只会增加一小部分可用的 CPU 内核”听起来像是普遍适用的东西,而不仅仅是 master?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多