我正在研究一个有很多非常强大的计算机的网格系统.这些可以用来非常快速地执行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开发有太多了解.他们只是想写他们的功能并调用它.
为了澄清,我对讨论可能使用哪种网络协议来实现客户端和服务器之间的通信感兴趣.我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象.
我也对在远程服务器上运行任意代码的安全性问题不感兴趣 - 我们只是说这个系统纯粹是为了研究而且是在一个严重防火墙的环境中.
查看PyRO (Python远程对象)它能够在集群中的所有计算机上设置服务,并直接调用它们,或通过名称服务器和发布 - 订阅机制间接调用它们.