为什么多处理不使用我所有的核心

why doesn't multiprocessing use all my cores

所以我做了一个计算素数的程序来测试使用多线程和只使用单线程之间的区别。我读到多处理绕过了 GIL,所以我希望性能得到不错的提升。

所以这里有我的代码来测试它:

def prime(n):
    if n == 2:
        return n
    if n & 1 == 0:
        return None
    
    d= 3
    while d * d <= n:
        if n % d == 0:
            return None
        d= d + 2
    return n

loop = range(2,1000000)
chunks = range(1,1000000,1000)
def chunker(chunk):
    ret = []
    r2 = chunk + 1000
    r1 = chunk
    for k in range(r1,r2):
        ret.append(prime(k))
    return ret
    
from multiprocessing import cpu_count
from multiprocessing.dummy import Pool
from time import time as t
pool = Pool(12)
start = t()
results = pool.map(prime, loop)
print(t() - start)
pool.close()
filtered = filter(lambda score: score != None, results)


new = []
start = t()
for i in loop:
    new.append(prime(i))
print(t()-start)
pool = Pool(12)
start = t()
results = pool.map_async(chunker, chunks).get()
print(t() - start)
pool.close()

我执行了这个程序,时间是:

multi processing without chunks:
4.953783750534058
single thread:
5.067057371139526
multiprocessing with chunks:
5.041667222976685

也许您已经注意到,但多处理并没有那么快。我有一个 6 核 12 线程的 AMD ryzen CPU,所以我希望如果我可以使用所有这些线程,我至少可以将性能提高一倍。但不是。如果我查看任务管理器,使用多进程的 cpu 平均使用率为 12%,而单线程使用大约 cpu.

的 10%

所以这是怎么回事?我做错什么了吗?或者说能够绕过 GIL 并不意味着能够使用更多的核心? 如果我不能在多处理中使用更多内核,那我该怎么办?

from multiprocessing.dummy import Pool
from time import time as t
pool = Pool(12)

来自the documentation

multiprocessing.dummy replicates the API of multiprocessing but is no more than a wrapper around the threading module.

换句话说,您仍在使用线程,而不是进程。

要使用流程,请执行 from multiprocessing import Pool