我正在AWS上构建测试应用。我有一台拥有该应用程序的“主”机器。有时,我希望能够将处理卸载到一些按需从属机器上。假设一个实例化的slave,只需要最少的必需软件(不包括我的主应用程序),我如何将'Python代码的功能单元'发送给一个或多个从属程序执行?
我知道并接受这个架构可能因为很多原因而不是最佳的 - 我知道如果我可以在启动时在我的实例上预安装相关代码会更简单。但是我们假设我们有一个硬约束,即奴隶实例不能在OS和一些基本库之外预加载 - 例如,如果我想在另一台机器上喷射一些生成的代码怎么办?
编辑:StackOverflow就是这样一个SHIT HOT资源!感谢大家的回复。真棒。给我几天时间,我会报告回来。
答案 0 :(得分:3)
我已经多次遇到过这个问题了。
eval()
当我想快速解决问题时,我会在stdlib中使用eval()
或其中一个表兄弟。将源传输到主服务器,然后编译并评估:
src = getSourceFromMaster()
obj = compile(src, "master.py", "exec")
exec(obj)
只要您从客户端到服务器获取源的传输是值得信赖的,并且源需要采取的操作相对简单,这就行了起来。有几次我需要在主机和从机之间进行更紧密的集成,需要大量的来回处理或复杂的数据结构。在这些情况下,我使用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
”行 - 该代码来自服务器。
如果您从裸操作系统安装开始,您可以在启动新实例后立即下载python脚本以使用SSH托管客户端代码。那么你将拥有一个很好的基础设施。
我不能再详细说明其中任何一个应用于AWS,也不能将它们与AWS基础架构提供的实用程序进行比较。欢迎提出想法或讨论。
答案 1 :(得分:1)
使用SSH将代码scp到slave。使用专用于此目的的EC2密钥对设置从站。将EC2密钥对放在主服务器上。这很简单,设置快捷。
另一个选择是使用AWS Elastic MapReduce和dumbo或mrjob来管理从属。这是更多的设置工作,但对故障更加健壮,为您提供任务跟踪功能等。
答案 2 :(得分:0)
您可以调查XMLPRClib
它需要一些设置,但一旦设置它就像你正在调用本地函数。
答案 3 :(得分:0)
我认为Pyro 3将通过将python字节码文件从master复制到slave来完成此操作。但是,我认为这种“移动代码”方法很糟糕,因为它还需要测试和调试。它使得代码运行(以及何时)不可预测,并且可以创建一组更难以诊断的新问题。分布式计算已经很难管理,我认为你不需要知道在哪里运行代码的复杂性。
IMO,你最好放弃这个(人为的?)限制,你无法在工作机器上安装代码。删除该约束并在工作人员上设置代码后,您将拥有许多选项。仅举几例:
要管理在工作人员上设置代码,您可以考虑在Fabric中编写部署脚本。