0

C の世界では、関数はエラー コードを返して終了ステータスを表し、INOUT/OUT パラメータを使用してプロセスの実際の結果を運ぶことができます。xmlrpcに関しては、INOUT/OUTパラメータはありませんが、終了ステータスと実際の結果を表すためのベストプラクティス/規則はありますか?

コンテキストは、サーバー上で実行されているエージェント/デーモン (python SimpleXMLRPCServer) を作成しようとしており、それと対話するための「プロトコル」を設計したいということです。

アドバイスをいただければ幸いです。

EDIT : S.Lott のコメントに従って、問題をより明確にします。

  • これは、C の規則ではなく、OS の規則に関するものです。私はそれに同意します。

  • エージェントの仕事は、本質的に終了コード/結果イディオムを使用して、サーバー上で何らかのコマンドを実行することです。

.

4

2 に答える 2

1

Pythonでこれを実装する簡単な方法の1つは、タプルを使用することです。関数に次のタプルを返すようにします:(ステータス、結果)ここで、ステータスは数値または文字列にすることができ、結果は任意のPythonデータ構造にすることができます。

これは、モジュールのドキュメントを基にした例です。サーバーコード:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)

def myfunction(x, y):
    status = 1
    result = [5, 6, [4, 5]]
    return (status, result)
server.register_function(myfunction)

# Run the server's main loop
server.serve_forever()

クライアントコード:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.myfunction(2, 4)

サーバー関数はタプルを返します

于 2010-02-07T17:00:10.923 に答える
1

「C の世界では、関数はエラー コードを返して終了ステータスを表し、INOUT/OUT パラメータを使用してプロセスの実際の結果を運ぶことができます」

  1. 終了ステータスをハックと見なしてください。これは C 主義ではなく、Linux 主義です。C 関数は、正確に 1 つの値を返します。C には例外がないため、失敗を示す方法はいくつかありますが、どれもかなり悪いものです。

    例外処理が必要です。Python と Java にはこれがあり、終了ステータスは必要ありません。

    ただし、シェルスクリプトはまだ非常に原始的であり、一部の言語 (C など) は例外を生成できないため、OS は依然として終了ステータスに依存しています。

  2. in/out 変数もハックであると考えてください。関数には値を返すだけでなく、複数の副作用があるため、これはひどいハックです。

これらの「機能」は両方とも、従うべき最良の設計パターンではありません。

理想的には、関数は「冪等」であり、何回呼び出しても同じ結果が得られます。In/Out 変数は、あいまいでデバッグしにくい方法で冪等性を破ります。

これらの機能はどちらも実際には必要ありません。そのため、それらを実装するためのベスト プラクティスがあまり見られません。

ベスト プラクティスは、値を返すか、例外を発生させることです。複数の値を返す必要がある場合は、タプルを返します。うまくいかなかった場合は、終了ステータスを返さず、例外を発生させます。


アップデート。リモート プロセスは基本的にリモート コマンドを実行するための RSH であるため、実行することを行う必要がありますremctl

http://linux.die.net/man/1/remctlを正確に模倣する必要があります。Python クライアントとサーバーを作成する必要があります。サーバーは、ステータス コード (およびランタイムなどのその他の概要) を含むメッセージを返します。クライアントは同じステータス コードで終了します。

于 2010-02-07T21:28:11.393 に答える