我正在研究一个拥有许多非常强大的计算机的网格系统。这些可以用来非常快速地执行python函数。我的用户有许多python函数,需要很长时间才能在工作站上计算,理想情况下,他们希望能够在远程强大的服务器上调用某些函数,但它似乎在本地运行。
Python有一个叫做“apply”的旧函数 - 现在python支持扩展调用语法(例如**参数),现在几乎没用了,但是我需要实现类似这样的东西:
rapply = Rapply( server_hostname ) # Set up a connection
result = rapply( fn, args, kwargs ) # Remotely call the function
assert result == fn( *args, **kwargs ) #Just as a test, verify that it has the expected value.
Rapply应该是一个类,可用于在远程服务器上远程执行某些任意代码(fn
可能是任何字面上的任何代码)。它将发回rapply
函数将返回的结果。 “结果”应该具有相同的值,就像我在本地调用函数一样。
现在让我们假设fn
是用户提供的函数,我需要某种方式通过线路将它发送到执行服务器。如果我能保证fn总是很简单,它可能只是一个包含python源代码的字符串......但是如果它不那么简单呢?
如果fn
可能有本地依赖关系怎么办?它可能是一个使用在不同模块中定义的类的简单函数,是否有封装fn
的方法以及fn
的所有内容需要哪个不是标准库?理想的解决方案不需要该系统的用户对python开发有太多了解。他们只是想写出他们的功能并调用它。
为了澄清一点,我对讨论可能使用哪种网络协议来实现客户端与客户端之间的通信感兴趣。服务器。我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象。
我对在远程服务器上运行任意代码的安全隐患也不感兴趣 - 我们只是说这个系统纯粹是为了研究,而且是在一个严重防火墙的环境中。
答案 0 :(得分:7)
查看PyRO(Python远程对象)它能够在集群中的所有计算机上设置服务,并直接调用它们,或通过名称服务器和发布 - 订阅机制间接调用它们。
答案 1 :(得分:4)
听起来你想要做以下事情。
定义共享文件系统空间。
将所有python源放在此共享文件系统空间中。
定义将“execfile”代码块的简单代理或服务器。
您的客户端然后联系代理(使用POST方法的REST协议适用于
这个)代码块。
代理保存代码块并对该代码块执行execfile
。
由于所有代理共享一个公共文件系统,因此它们都具有相同的Python库结构。
我们使用一个简单的WSGI应用程序,我们称之为“批处理服务器”。我们有RESTful协议来创建和检查远程请求。
答案 2 :(得分:1)
Stackless有能力挑选和取消运行代码。不幸的是,当前的实现不支持此功能。
答案 3 :(得分:1)
您可以使用现成的群集解决方案,例如Parallel Python。您可以相对轻松地设置multiple remote slaves and run arbitrary code on them。
答案 4 :(得分:0)
您可以使用SSH连接到远程PC并直接在另一台计算机上运行命令。你甚至可以将python代码复制到机器上并执行它。
答案 5 :(得分:0)
cat ./test.py | sshpass -p'password'ssh user @ remote-ip“python-script-arguments-if-any for test.py script”
1)这里“test.py”是本地python脚本。 2)sshpass用于将ssh密码传递给ssh连接