这可以看作是 I/O 绑定任务吗?
Can this be viewed as an I/O bound task?
假设您的计算机上有 4 个物理内核,并且假设没有超线程并且 python 版本为 3.2+(尽管我不确定这些额外信息是否对我的问题很重要)。
如果我要打开一个包含 3 个子进程的池,因此每个子进程在执行某些 CPU 绑定任务时占用一个物理核心,如果我要从当前进程中打开 3 个线程(占用4) 留下一个核心,其中 OS 是 运行,如果我要将 CPU 绑定任务发送到多处理中的每一个 3 个子进程,那么问题是:
从管理线程的当前进程的角度来看(这些线程正在将任务推送到每个子进程并等待结果从这些子进程返回),这些 CPU 是否可以绑定任务被视为 I/O 绑定任务(从当前进程的角度来看),因为当前进程实际上没有做任何工作?等价地,3个线程是否会进入睡眠状态,而3个子进程正在处理数字并占用3个核心,让最后一个核心闲置?
will the 3 threads go to sleep, while the 3 subprocesses are crunching away at the numbers and occupying the 3 cores, and let the last core sit there idling?
是的。我无法想象还会发生什么,你有没有想到另一种可能性?如您所说,线程正在等待。
在这种情况下,您可能可以让 4 个进程处理 CPU 绑定任务。
听起来你的问题很适合 multiprocessing.Pool
。在这种情况下请注意,如果您不指定要使用的进程数,它默认使用 CPU 个核心数:
processes is the number of worker processes to use. If processes is None
then the number returned by os.cpu_count()
is used.
这是一个官方标志,表明使用与内核一样多的进程是一种正常做法。
假设您的计算机上有 4 个物理内核,并且假设没有超线程并且 python 版本为 3.2+(尽管我不确定这些额外信息是否对我的问题很重要)。
如果我要打开一个包含 3 个子进程的池,因此每个子进程在执行某些 CPU 绑定任务时占用一个物理核心,如果我要从当前进程中打开 3 个线程(占用4) 留下一个核心,其中 OS 是 运行,如果我要将 CPU 绑定任务发送到多处理中的每一个 3 个子进程,那么问题是:
从管理线程的当前进程的角度来看(这些线程正在将任务推送到每个子进程并等待结果从这些子进程返回),这些 CPU 是否可以绑定任务被视为 I/O 绑定任务(从当前进程的角度来看),因为当前进程实际上没有做任何工作?等价地,3个线程是否会进入睡眠状态,而3个子进程正在处理数字并占用3个核心,让最后一个核心闲置?
will the 3 threads go to sleep, while the 3 subprocesses are crunching away at the numbers and occupying the 3 cores, and let the last core sit there idling?
是的。我无法想象还会发生什么,你有没有想到另一种可能性?如您所说,线程正在等待。
在这种情况下,您可能可以让 4 个进程处理 CPU 绑定任务。
听起来你的问题很适合 multiprocessing.Pool
。在这种情况下请注意,如果您不指定要使用的进程数,它默认使用 CPU 个核心数:
processes is the number of worker processes to use. If processes is
None
then the number returned byos.cpu_count()
is used.
这是一个官方标志,表明使用与内核一样多的进程是一种正常做法。