如何将Python代码发送到其他机器执行?
我正在AWS上搭建一个测试应用。我有一台“主”机器负责整个应用。有时候,我想把一些处理任务转移到按需的“从”机器上。假设我已经启动了一台从机器,并且它只安装了运行这个应用所需的最基本的软件(不包括我的主要应用),那么我该如何把一些Python代码的功能单元“发送”到一台或多台从机器上执行呢?
我知道并且接受这种架构可能不是最优的,很多原因都说明了这一点。我也知道如果在启动时能预先安装好相关代码会简单很多。但假设我们有一个硬性限制,就是从机器上只能预装操作系统和一些基本的库——比如说,如果我想把一些生成的代码发送到另一台机器上,该怎么做呢?
编辑:StackOverflow真是个超棒的资源!感谢大家的回复,太棒了。给我几天时间,我会再回来汇报进展。
4 个回答
你可以看看XMLPRClib这个东西。
- 有没有好的Python教程/指南教你怎么用XML-RPC和Last.fm的API?
- http://docs.python.org/library/xmlrpclib.html
- http://oreilly.com/pub/a/python/2000/11/22/xmlrpcclient.html
它需要稍微设置一下,但一旦设置好后,就像是在调用本地的函数一样简单。
我在不同情况下遇到过这个问题好几次。
选项 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基础设施提供的工具。欢迎大家讨论或分享想法。