如何将Python代码发送到其他机器执行?

3 投票
4 回答
2250 浏览
提问于 2025-04-16 23:24

我正在AWS上搭建一个测试应用。我有一台“主”机器负责整个应用。有时候,我想把一些处理任务转移到按需的“从”机器上。假设我已经启动了一台从机器,并且它只安装了运行这个应用所需的最基本的软件(不包括我的主要应用),那么我该如何把一些Python代码的功能单元“发送”到一台或多台从机器上执行呢?

我知道并且接受这种架构可能不是最优的,很多原因都说明了这一点。我也知道如果在启动时能预先安装好相关代码会简单很多。但假设我们有一个硬性限制,就是从机器上只能预装操作系统和一些基本的库——比如说,如果我想把一些生成的代码发送到另一台机器上,该怎么做呢?

编辑:StackOverflow真是个超棒的资源!感谢大家的回复,太棒了。给我几天时间,我会再回来汇报进展。

4 个回答

0

你可以看看XMLPRClib这个东西。

它需要稍微设置一下,但一旦设置好后,就像是在调用本地的函数一样简单。

1

使用SSH命令把代码传输到从属服务器上。为这些从属服务器设置一个专用的EC2密钥对。把这个EC2密钥对放在主服务器上。这种方法简单快捷。

另一种选择是使用AWS的弹性MapReduce服务,并配合dumbomrjob来管理从属服务器。这种方法设置起来会稍微复杂一些,但在遇到故障时会更可靠,还能提供任务跟踪等功能。

4

我在不同情况下遇到过这个问题好几次。

选项 1 - eval()

当我想快速搞定某件事情时,我会使用eval()或者它的其他类似功能。把源代码传到主机上,然后编译并执行:

src = getSourceFromMaster()
obj = compile(src, "master.py", "exec")
exec(obj)

只要你从客户端到服务器的传输是可靠的,而且源代码需要执行的操作比较简单,这种方法就能奏效。有几次我需要主机和从机之间更紧密的集成,需要频繁的数据交换或者复杂的数据结构。在这种情况下,我会使用Pyro

选项 2 - Pyro

Pyro是一个完整的、跨平台的Python远程方法执行库。我在生产环境中使用过它,可以把处理任务从Linux机器发送到Windows机器,然后再返回,效果非常稳定。

以下是他们文档中的示例:

主机:

# save this as greeting.py
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)

从机:

# save this as client.py
import greeting
name=raw_input("What is your name? ")
greeting_maker=greeting.GreetingMaker()
print greeting_maker.get_fortune(name)

输出:

$ python client.py
What is your name? Irmen
Hello, Irmen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.

Pyro最棒的地方在于client.py中的那行"import greeting"——这段代码来自服务器。

如果你从一个干净的操作系统安装开始,可以在启动新实例后,立即通过SSH把Python脚本推送到主机上,以托管客户端代码。这样你就有了一个不错的工作环境。

关于这两种方法在AWS上的应用,我不能提供更多细节,也无法比较它们与AWS基础设施提供的工具。欢迎大家讨论或分享想法。

撰写回答