我有一个计算密集型程序进行计算,我打算并行化。它是用python编写的,我希望使用multiprocess
模块。我希望能帮助理解我需要做些什么来从我的笔记本电脑上运行一个程序来控制整个过程。
对于我可以使用的计算机,我有两种选择。一个是我可以从终端通过ssh user@comp1.com
访问的计算机(不知道如何通过python访问它们),然后在那里运行实例,虽然我想要一个更程序化的方式来获取它们而不是。似乎如果我运行a remote manager类型的应用程序它会起作用吗?
我想的第二个选择是使用AWS E2C服务器。 (我认为这就是我需要的)。我发现boto我从未使用过,但似乎提供了一个控制AWS系统的界面。我觉得我需要在AWS上实际分配工作,可能与选项1(?)类似。我在这里有点黑暗。
编辑:
让您了解它的并行性:
res = []
for param in Parameters:
res.append(FunctionA(param))
Parameters2 = FunctionB(res)
res2 = []
for param in Parameters2:
res2.append(FunctionC(param))
return res, res2
所以这两个循环基本上是我可以发送许多param
值并行运行的地方我知道如何重新组合它们来创建res
,只要我知道哪个param
他们来自。然后我需要将它们组合在一起以获得Parameters2
,然后第二部分再次可并行化。
答案 0 :(得分:1)
只有当您希望进程在内存中共享数据时,才会使用多进程模块。如果由于性能考虑而绝对必须拥有共享内存,那么这是我建议的。 python多进程应用程序是非常容易编写和调试的。
如果你正在做像distributed.net或seti @ home项目这样的事情,即使这些任务在计算上是有意的,它们也是合理隔离的,你可以按照以下过程进行。
如果您愿意,您可以在AWS单核实例上运行这些流程,或者使用笔记本电脑运行尽可能多的副本,而无需使用核心。
编辑:基于更新的问题
因此,您的主进程将创建其中包含参数信息的文件(或其他一些数据结构)。你有许多文件可以处理。这些文件将存储在名为needed-work
的共享文件夹中每个python worker(在AWS实例上)将查看所需的工作共享文件夹,查找要处理的可用文件(或等待套接字以便主进程将文件分配给它们)。
接受需要工作的文件的python进程将对其进行处理,并将结果存储在单独的共享文件夹中,并将该参数作为文件结构的一部分。
主进程将查看work-done文件夹中的文件,处理这些文件并生成组合响应
整个解决方案也可以作为套接字实现,其中工作人员将监听主服务器的套接字以将工作分配给他们,主服务器将在套接字上等待工作人员提交响应。
基于文件的方法需要一种方法让工人确保他们接收的工作不会被另一名工人接管。这可以通过为每个工作人员分别设置工作文件夹来解决,主进程将决定何时需要为工作人员提供更多工作。
工作人员可以删除他们从工作文件夹中提取的文件,主进程可以在文件夹为空时监视并向其添加更多工作文件。
如果您对套接字感到满意,再次使用套接字会更优雅。