2

Pyro4 を使用してサーバー上で関数を実行しようとしています。コードを見てください: =========================Client================ ======

import Pyro4
def square(x): 
    return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))

===========================サーバー===================== ====

import Pyro4
class Server(object):
    def evaluate(self, func, args):
        return func(*args)

def main():
    server = Server()
    Pyro4.Daemon.serveSimple({server: "server"},ns=True)

if __name__ == '__main__':
    main()

========================ネーミングサーバー=======================

import Pyro4
Pyro4.naming.startNSloop()

================================================== =========

エラーが発生しました: " Pyro4.errors.ConnectionClosedError: received: not enough data ". 以下の完全なスタック トレースを見てください。

    Traceback (most recent call last):
  File "C:\Users\Alex\Desktop\2.py", line 9, in <module>
    print(remoteServer.evaluate(square, 4))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 169, in __call__
    return self.__send(self.__name, args, kwargs)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 380, in _pyroInvoke
    msg = message.Message.recv(self._pyroConnection, [message.MSG_RESULT], hmac_key=self._pyroHmacKey)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\message.py", line 161, in recv
    msg = cls.from_header(connection.recv(cls.header_size))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 460, in recv
    return receiveData(self.sock, size)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 195, in receiveData
    raise err
Pyro4.errors.ConnectionClosedError: receiving: not enough data

メソッド(関数)に渡された関数をサーバーに実行させたい。

PS: Windows7、Python 3.4.1

同様の質問 ( How to send a function to a remote Pyro object ) を見つけましたが、うまくいきませんでした。コールバック デコレーター @pyro4.callback を使用しようとしましたが、公式の例 ( https://github.com/delmic/Pyro4/tree/master/examples/callback : server2.py, client2.py) でさえ機能しませんでした (python を使用) 3.4 および python 2.7) => メッセージのみ:「サーバー: クライアントへのコールバック 1 を実行しています」が表示され、何も起こりません。


ありがとう

4

1 に答える 1

1

リンク先の github リポジトリは公式のものではありません。これはクローンです (かなり古いバージョンから)。これは公式リポジトリです: https://github.com/irmen/Pyro4

あなたの問題に関しては、関数をシリアル化してネットワーク経由で送信することはできません。Pyro に pickle をシリアライゼーション プロトコルとして使用するように指示した場合、より多くのトリックを行うことができますが、pickle は接続の両側でモジュール ソースまたはバイトコードを利用できる必要があります。

クライアントがクラッシュする理由は、サーバーが Pyro プロトコル エラーにより接続を中止したためです。ロギングを有効にすると、サーバーのログファイルに「Pyro4.errors.ProtocolError: unsupported serialized class: builtins.function」のように表示されます。

また、別のソース コード ファイルを使用してネーム サーバーを起動する必要はありません。コマンドラインから直接起動できます。

最後に、@pyro4.callback デコレーターは無関係です。意図されていることについては、 http://pythonhosted.org/Pyro4/clientcode.html ?highlight=callback#pyro-callbacks をお読みください。これは、Pyro が例外を処理する方法に影響を与えますが、それ以上のものではありません。

編集: Pyro 4.35 以降、このエラーはクライアントに正しく報告され、中止された接続を取得しないことに注意してください。

于 2015-02-14T18:36:50.827 に答える