亚马逊AWS - 初学者的Python

2 投票
1 回答
806 浏览
提问于 2025-04-18 03:21

我有一个计算量很大的程序,它在做一些计算,我打算把它并行化。这个程序是用Python写的,我希望使用multiprocess模块。我想了解一下,怎样才能让我的笔记本电脑上的一个程序控制整个过程。

我有两种选择可以用来运行这个程序的电脑。第一种是可以通过终端用ssh user@comp1.com访问的电脑(我不太确定怎么通过Python访问它们),然后在那儿运行程序,不过我希望能有一种更程序化的方法来访问它们。看起来如果我运行一个远程管理器类型的应用程序,这样就可以实现了?

第二种选择是使用AWS的E2C服务器。(我觉得这可能是我需要的)。我发现了boto,虽然我从来没用过,但它似乎提供了一个控制AWS系统的接口。我觉得我还需要一些东西来实际在AWS上分配任务,可能和第一种选择类似(?)。我对此有点不太清楚。

编辑:

为了让你了解这个程序有多容易并行化:

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值的地方,只要我知道这些param来自哪里,我就知道怎么把它们重新组合成res。然后我需要把它们全部组合在一起,得到Parameters2,而第二部分也是可以并行化的。

1 个回答

1

你只应该在需要多个进程共享内存数据时使用多进程模块。这个情况我建议只有在你真的因为性能原因需要共享内存时才考虑。用Python写多进程的程序并不简单,调试起来也比较麻烦。

如果你在做像distributed.net或seti@home这样的项目,虽然这些任务计算量大,但它们之间相对独立,你可以按照以下步骤进行。

  1. 创建一个主程序,把大任务拆分成小的计算块(假设这个任务可以拆分,最后的结果可以集中合并)。
  2. 编写Python代码,从服务器获取任务(可能是一个文件,或者其他一次性的通信,告诉你该做什么),然后运行多个这些Python进程的副本。
  3. 这些Python进程会相互独立地工作,处理数据,然后把结果返回给主进程,主进程负责汇总结果。

如果你愿意,可以在AWS的单核实例上运行这些进程,或者用你的笔记本电脑运行尽可能多的副本,直到你用完所有的核心。

编辑:根据更新的问题

你的主进程会创建一些文件(或其他数据结构),里面包含参数信息。文件的数量和你要处理的参数数量一样。这些文件会存放在一个叫做needed-work的共享文件夹里。

每个Python工作进程(在AWS实例上)会查看needed-work共享文件夹,寻找可用的文件进行处理(或者在一个套接字上等待主进程分配文件给它们)。

接手需要处理文件的Python进程会处理这个文件,并把结果存储在一个单独的共享文件夹里,文件名中包含参数信息。

主进程会查看work-done文件夹里的文件,处理这些文件并生成合并后的响应。

整个方案也可以用套接字实现,工作进程会监听套接字,等待主进程分配工作,而主进程则会在套接字上等待工作进程提交响应。

基于文件的方法需要一种方式,确保工作进程拿到的工作不会被其他进程抢走。可以通过为每个工作进程设置单独的工作文件夹来解决,主进程会决定何时需要为工作进程增加更多的工作。

工作进程可以删除它们从工作文件夹中拿到的文件,主进程可以监控文件夹是否为空,并向其中添加更多的工作文件。

如果你对套接字比较熟悉,使用套接字会更优雅一些。

撰写回答