多进程似乎使用单个逻辑核心

Multiprocesses seem to use a single logical core

我正在尝试执行不同进程可以调用的共享函数。找到的唯一方法是创建一个包含此函数的 class(请参阅 )。但现在我面临的问题是进程似乎在等待某些东西,因此仅使用单个逻辑核心的功能(见图)。

我用下面的代码成功重现了同样的问题(已简化):

#!/usr/bin/python

from multiprocessing import Pool
from multiprocessing.managers import BaseManager
from itertools import repeat

class FunctionManager(BaseManager):
    pass

class MaClass:
    def maFunction(self, val):
        print(str(val))
        for i in range(0, 10000):
            for j in range(0, 10000):
                for k in range(0, 10000):
                    pass

FunctionManager.register('MaClass', MaClass)

myManager = FunctionManager()
myManager.start()
monObjet = myManager.MaClass()

p = Pool()
p.imap_unordered(monObjet.maFunction, range(10))
p.close()
p.join()

myManager.shutdown()

有什么想法吗?

monObject 不是常规 class 实例,它是实例的代理 <class 'multiprocessing.managers.AutoProxy[MaClass]'>。当子进程调用该代理时,请求返回到处理它的父进程。做代理的后台线程仍然受制于GIL,所以无论有多少子进程调用它,它一次只能执行其中一个线程。

池中的代理方法 运行 并不常见。我很感激您刚刚编写了一个示例,可能真的需要 运行 父级中的方法,但这里有一个稻草人示例,可以将工作保留在子级中

#!/usr/bin/python

from multiprocessing import Pool

def worker(val):
    c = MaClass()
    return c.maFunction(val)

class MaClass:
    def maFunction(self, val):
        print(str(val))
        for i in range(0, 10000):
            for j in range(0, 10000):
                for k in range(0, 10000):
                    pass

p = Pool()
p.imap_unordered(worker, range(10))
p.close()
p.join()