假设你的计算机上有 4 个物理内核,让我们假设没有超线程,Python 版本是 3.2+(尽管我不确定这些额外的信息是否对我的问题很重要(。
如果我要打开一个包含 3 个子进程的池,因此每个子进程在执行一些 CPU 绑定任务时占用一个物理内核,并且如果我从运行操作系统的当前进程中打开 3 个线程(占用 4 个剩余的一个内核(,并且如果我要将 CPU 绑定任务发送到多处理到 3 个子进程中的每一个, 那么问题是这样的:
从管理线程的当前进程的角度来看(这些线程正在将任务推送到每个子进程,并等待结果从这些子进程返回(,是否可以将这些 CPU 绑定任务视为 I/O 绑定任务(从当前进程的角度来看(,因为当前进程实际上并没有做任何工作?等价地,3 个线程会进入睡眠状态,而 3 个子进程正在处理数字并占据 3 个内核,并让最后一个内核闲置吗?
3 个线程会进入睡眠状态,而 3 个子进程正在处理数字并占据 3 个内核,让最后一个内核闲置吗?
是的。我无法想象还会发生什么,你还有另一种可能性吗?正如你所说,线程正在等待。
在这种情况下,您可能可以使 4 个进程来处理 CPU 密集型任务。
听起来您的问题非常适合multiprocessing.Pool
.在这种情况下,请注意,如果未指定要使用的进程数,则默认情况下将使用 CPU 内核数:
是要使用的工作进程数。如果进程
None
则使用os.cpu_count()
返回的数字。
这是一个官方迹象,表明使用与内核一样多的进程是一种正常的做法。