7

我正在研究一个网格系统,它有许多非常强大的计算机。这些可用于非常快速地执行 python 函数。我的用户有许多 python 函数需要很长时间才能在工作站上计算,理想情况下他们希望能够在远程强大的服务器上调用一些函数,但让它看起来在本地运行。

Python 有一个名为“apply”的旧函数 - 现在 Python 支持扩展调用语法(例如 **arguments),现在它几乎没用了,但是我需要实现一些有点像这样的东西:

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 开发有太多的了解。他们只是想编写他们的函数并调用它。

澄清一下,我对讨论可以使用哪种网络协议来实现客户端和服务器之间的通信不感兴趣。我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象。

我也对在远程服务器上运行任意代码的安全隐患不感兴趣——我们只是说这个系统纯粹是为了研究而设计的,它位于一个防火墙环境中。

4

6 回答 6

8

看看PyRO (Python 远程对象),它能够在集群中的所有计算机上设置服务,并直接或通过名称服务器和发布-订阅机制间接调用它们。

于 2009-02-11T14:56:50.957 回答
4

听起来您想要执行以下操作。

  • 定义一个共享文件系统空间。

  • 将你所有的 python 源代码放在这个共享的文件系统空间中。

  • 定义将“执行文件”代码块的简单代理或服务器。

  • 然后,您的客户端使用代码块联系代理(带有 POST 方法的 REST 协议
    对此非常有效)。代理保存代码块并对该execfile代码块执行操作。

由于所有代理共享一个公共文件系统,它们都具有相同的 Python 库结构。

我们使用一个简单的 WSGI 应用程序,我们称之为“批处理服务器”。我们有用于创建和检查远程请求的 RESTful 协议。

于 2009-02-11T11:38:18.343 回答
2

Stackless有能力对正在运行的代码进行腌制和解封。不幸的是,当前的实现不支持此功能。

于 2009-02-11T12:57:51.100 回答
1

您可以使用现成的集群解决方案,例如Parallel Python。您可以相对轻松地设置多个远程从站并在它们上运行任意代码

于 2009-02-11T14:21:54.190 回答
0

您可以使用 SSH 连接到远程 PC 并直接在另一台机器上运行命令。您甚至可以将 python 代码复制到机器上并执行它。

于 2009-02-11T12:55:01.483 回答
0

句法:

猫./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 连接

于 2015-06-16T05:20:41.327 回答