我在为我的应用程序决定使用python多处理或celery或pp时遇到了一些麻烦.
我的应用程序非常重CPU,但目前只使用一个cpu,所以我需要将它扩展到所有可用的cpus(这使我看到python的多处理库)但我读到如果需要,这个库不会扩展到其他机器.现在我不确定我是否需要多个服务器才能运行我的代码,但我想在本地运行celery然后扩展只需要添加新的服务器而不是重构代码(就像我使用的那样)多).
我的问题:这个逻辑是否正确?在本地使用芹菜是否存在任何负面影响(如果事实证明,具有多个核心的单个服务器可以完成我的任务)?或者是否更多建议使用多处理并在以后将其扩展到其他内容?
谢谢!
ps这是一个个人学习项目,但我可能有一天会喜欢在一家公司担任开发人员,并希望了解专业人士如何做到这一点.
我有multiprocessing一些看起来有点像这样的Python代码:
import time
from multiprocessing import Pool
import numpy as np
class MyClass(object):
def __init__(self):
self.myAttribute = np.zeros(100000000) # basically a big memory struct
def my_multithreaded_analysis(self):
arg_lists = [(self, i) for i in range(10)]
pool = Pool(processes=10)
result = pool.map(call_method, arg_lists)
print result
def analyze(self, i):
time.sleep(10)
return i ** 2
def call_method(args):
my_instance, i = args
return my_instance.analyze(i)
if __name__ == '__main__':
my_instance = MyClass()
my_instance.my_multithreaded_analysis()
Run Code Online (Sandbox Code Playgroud)
在阅读了有关内存如何在其他StackOverflow答案(例如Python多处理内存使用情况)中工作的答案后,我认为这不会使用内存与我用于多处理的进程数量成比例,因为它是写时复制和我没有修改任何属性my_instance.但是,当我运行顶部时,我确实看到了所有进程的高内存,它说我的大多数进程都使用了大量内存(这是OSX的最高输出,但我可以在Linux上复制).
我的问题基本上是,我是否正确地解释了这一点,因为我的实例MyClass实际上是在池中重复的?如果是这样,我该如何防止这种情况; 我应该不使用这样的结构吗?我的目标是减少计算分析的内存使用量.
PID COMMAND …Run Code Online (Sandbox Code Playgroud) python memory-management multiprocessing python-multiprocessing