多进程似乎使用单个逻辑核心
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()
我正在尝试执行不同进程可以调用的共享函数。找到的唯一方法是创建一个包含此函数的 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()