我正在研究一个网格系统,它有许多非常强大的计算机。这些可用于非常快速地执行 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 开发有太多的了解。他们只是想编写他们的函数并调用它。
澄清一下,我对讨论可以使用哪种网络协议来实现客户端和服务器之间的通信不感兴趣。我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象。
我也对在远程服务器上运行任意代码的安全隐患不感兴趣——我们只是说这个系统纯粹是为了研究而设计的,它位于一个防火墙环境中。