【问题标题】:How can I send python code to another machine to be executed?如何将 python 代码发送到另一台机器上执行?
【发布时间】:2011-08-11 16:05:14
【问题描述】:

我正在 AWS 上构建一个测试应用程序。我有一台拥有该应用程序的“主”机器。有时,我希望能够将处理任务卸载到一些按需从属机器上。假设一个实例化的从站,只需要最少的软件(不包括我的主应用程序),我如何将 Python 代码的功能单元“发送”到一个或多个从站执行?

我知道并接受这种架构可能由于多种原因可能不是最优的 - 我知道如果我可以在启动时在我的实例上预安装相关代码会更简单。但是让我们假设我们有一个硬约束,即从属实例不能在操作系统和一些基本库之外预加载 - 例如,如果我想在另一台机器上喷射一些生成的代码怎么办?

编辑:StackOverflow 是一个非常糟糕的资源!感谢大家的回复。惊人的。给我几天时间,我会回来报告的。

【问题讨论】:

  • 我不同意这属于 ServerFault。这是一个真正的编程/设计问题。
  • 你的 Python 代码的 sn-p 将在什么 context 中执行?你说你的主应用程序不会在远程机器上,但你没有说 is 会在那里。 sn-p 需要的上下文越多,您需要发送到远程的代码就越多。
  • 我实际上是在尝试了解如何将代码“发送和执行”到远程(......在探索 AWS 的可能性时仍然是菜鸟)。但是一个微不足道的,有效的(在我的情况下)示例是:想象主服务器上的一个函数 foo() - 它拥有 foo() 的源 - 我如何将 foo() 发送到远程(......假设任何foo() 所依赖的库已经安装在遥控器上。
  • 您可以通过多种方式发送代码。默认情况下,AWS 防火墙规则只打开端口 22,所以通常人们会使用 SSH(例如:PyPI 上的 paramiko 库)来复制文件。或者,您可以只发送描述函数foo 的字符串,然后使用 compile 和 exec 内置函数将该字符串转换为字节码并在远程机器上执行。当然,我仍然认为最好的解决方案是放弃不能在从机上安装代码的要求。

标签: python amazon-web-services


【解决方案1】:

我已经多次以各种方式遇到过这个问题。

选项 1 - eval()

当我想快速破解某些东西时,我使用eval() 或它在stdlib 中的表亲之一。把源码传给你的master,然后编译评估:

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

只要您从客户端到服务器获取源的传输是可信赖的,并且源需要采取的操作相对简单,就可以了。有几次我需要主从机器之间更紧密的集成,有很多来回处理或复杂的数据结构。在这些情况下,我使用Pyro

选项 2 - 火焰兵

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”行——该代码来自服务器。

如果您是从裸操作系统安装开始,您可以在启动新实例后立即下推 Python 脚本以使用 SSH 托管客户端代码。然后,您将拥有一个很好的基础架构来工作。

我无法详细说明其中任何一个在 AWS 上的应用,也无法将它们与 AWS 基础设施提供的实用程序进行比较。欢迎提出意见或讨论。

【讨论】:

    【解决方案2】:

    使用 SSH 将代码 scp 到从站。使用专门用于此目的的 EC2 密钥对设置从站。将 EC2 密钥对放在主服务器上。设置简单快捷。

    另一种选择是使用 AWS Elastic MapReduce 和 dumbomrjob 来管理从站。这需要更多的设置工作,但对故障更加稳健,为您提供任务跟踪功能等。

    【讨论】:

    • 谢谢。听起来像是我的第一个停靠港。
    【解决方案3】:

    【讨论】:

    • 谢谢。还没有探索过 XMLRPClib……对于我认为可能更简单的东西来说,这看起来太令人生畏了。
    • XMLRPC 实际上并不像它最初看起来那样难用。
    【解决方案4】:

    我认为Pyro 3 将通过将 python 字节码文件从主机复制到从机来实现这一点。但是,我认为这种“移动代码”方法很笨拙,因为这是您必须测试和调试的另一件事。它使运行的代码(以及何时运行)变得不可预测,并且会产生一系列更难诊断的全新问题。分布式计算已经很难管理,我认为你不需要不知道什么代码在哪里运行的复杂性。

    IMO,你最好放弃这个(人为的?)限制,你不能在工作机器上安装代码。一旦您放弃该约束并在您的工作人员上设置代码,您将有很多选择。仅举几例:

    要管理在工作人员上设置代码,您可以查看在 Fabric 中编写部署脚本。

    【讨论】:

    • 谢谢 Mike - 我已经在使用 Fabric,它非常棒。我只是有点想拥有一台协调事物的“主”机器——包括决定在哪里运行什么代码。当然,这是单点故障,但在 AWS 环境中这到底意味着什么?
    • 无论如何,在主服务器上进行协调。我只是提倡一种稍微不那么自动化的方法。此外,请记住,在 AWS 环境中,单点故障仍然很糟糕。但是,AWS 为您提供了让您应对的工具。例如,您可以在多个 ec2 区域或区域中拥有主服务器。在任何情况下,您仍然需要处理将代码放在多个位置的问题,才能真正应对 AWS 可用性问题。
    • 点了。具有讽刺意味的是(如果是这样的话)当爱尔兰的 AWS 发生重大中断时,我正在将我的应用程序从 Slicehost 转移到爱尔兰的 AWS。然后今天(搬迁后)Slicehost 在伊利诺伊州发生了重大中断。 :-) 是的,现在这是一个“人为”限制,但它代表了我认为适合未来工作的一般模式。
    • 很抱歉听到中断的消息,我自己也经历过一些 ;-) 那么为什么你觉得你更有可能必须以编程方式/动态移动代码而不是安装在设置 ec2 机器的同时编写代码?我在想,如果您有一个系统来动态配置 ec2 机器并安装 python 以及运行 sn-p 代码的依赖项,那么将代码部署到该机器就不会花费那么多额外的精力或时间。跨度>
    • 对于在我的从属服务器上预安装 y 类型的 x 版本软件,所有这些都与主服务器上的任何工作保持同步,我有一种刺痛的感觉。对我来说,在 master 上干运行它然后分发它似乎更好。我还希望设计一种涉及真正生成的代码但不可能预先安装的模式。
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多