私は、多数の非常に強力なコンピューターを備えたグリッド システムに取り組んでいます。これらを使用して、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.
fn
Rapply は、リモート サーバー上で任意のコード (文字通り何でもかまいません)をリモートで実行するために使用できるクラスである必要があります。rapply
関数が返す結果を返します。「結果」は、関数をローカルで呼び出した場合と同じ値になるはずです。
ここで、それがユーザー提供の関数であると仮定しましょうfn
。実行サーバーにネットワーク経由で送信する何らかの方法が必要です。fn が常に単純なものであることを保証できれば、Python ソース コードを含む文字列である可能性があります...しかし、それほど単純でない場合はどうでしょうか?
ローカルの依存関係がある場合fn
: 別のモジュールで定義されたクラスを使用する単純な関数である可能性があります。カプセル化する方法と、標準ライブラリではないfn
ものを必要とするすべてのものはありますか? fn
理想的なソリューションは、このシステムのユーザーが Python 開発について多くの知識を持っている必要がないことです。彼らは単に関数を書き、それを呼び出したいだけです。
明確にするために、クライアントとサーバー間の通信を実装するためにどのような種類のネットワーク プロトコルを使用するかについて議論することに興味はありません。私の問題は、関数とその依存関係を、シリアル化してリモートで実行できる単一のオブジェクトとしてカプセル化する方法です。
また、リモート サーバーで任意のコードを実行することによるセキュリティへの影響にも関心がありません。このシステムは純粋に研究目的であり、厳重にファイアウォールで保護された環境内にあるとだけ言っておきましょう。