53

デーモンとして実行される小さな Python アプリケーションを作成しました。スレッドとキューを利用します。

このアプリケーションを変更して、実行中に通信できるようにするための一般的な方法を探しています。ほとんどの場合、その健康状態を監視できるようにしたいと考えています。

一言で言えば、私はこのようなことができるようになりたいです:

python application.py start  # launches the daemon

後で、私は一緒に来て、次のようなことをしたいと思います:

python application.py check_queue_size  # return info from the daemonized process

明確にするために、Django にインスパイアされた構文を実装することに何の問題もありません。デーモン化されたプロセスにシグナルを送信する方法(開始)、またはそのようなシグナルを処理して応答するデーモンを作成する方法がわかりません。

上で言ったように、私は一般的なアプローチを探しています。私が今見ることができる唯一の方法は、必要なすべてのものを常にファイルに記録するようにデーモンに指示することですが、それを行うためのより簡単な方法があることを願っています.

更新:うわー、たくさんの素晴らしい答え。本当にありがとう。Pyro と web.py/Werkzeug の両方のアプローチを検討すると思います。この時点で Twisted は私が噛み締めたいと思っている以上のものです。次の概念上の課題は、ワーカー スレッドをハングアップさせずに対話する方法だと思います。

再度、感謝します。

4

8 に答える 8

36

さらに別のアプローチ:Pyro(Pythonリモーティングオブジェクト)を使用します。

Pyroでは基本的に、Pythonオブジェクトインスタンスをリモートで呼び出すことができるサービスとして公開できます。私はあなたが説明する正確な目的のためにPyroを使用しました、そして私はそれが非常にうまくいくことを発見しました。

デフォルトでは、Pyroサーバーデーモンはどこからでも接続を受け入れます。これを制限するには、接続バリデーター(ドキュメントを参照)を使用するかhost='127.0.0.1'、コンストラクターに提供してDaemonローカル接続のみをリッスンします。

Pyroのドキュメントから抜粋したサンプルコード:

サーバ

Pyro.coreをインポートする

クラスJokeGen(Pyro.core.ObjBase):
        def __init __(self):
                Pyro.core.ObjBase .__ init __(self)
        def joke(self、name):
                「申し訳ありませんが「+name+」、ジョークはわかりません。」を返します。

Pyro.core.initServer()
daemon = Pyro.core.Daemon()
uri = daemon.connect(JokeGen()、 "jokegen")

print "デーモンはポートで実行されます:"、daemon.port
print "オブジェクトのURIは次のとおりです:"、uri

daemon.requestLoop()

クライアント

Pyro.coreをインポートする

#自分のホスト/ポートに一致するように、以下のURIを変更する必要があります。
jokes = Pyro.core.getProxyForURI( "PYROLOC:// localhost:7766 / jokegen")

print jokes.joke( "Irmen")

別の同様のプロジェクトはRPyCです。私はRPyCを試していません。

于 2009-03-18T12:57:31.757 に答える
18

httpサーバーを実行させるのはどうですか?

クレイジーに見えますが、サーバーを管理するための単純なWebサーバーを実行するには、web.pyを使用して数行必要です。

unixパイプの作成を検討することもできます。

于 2009-03-18T04:22:00.497 に答える
16

werkzeugを使用して、デーモンにHTTPベースのWSGIサーバーを含めます。

デーモンには、ステータス情報で応答するための小さなWSGIアプリのコレクションがあります。

クライアントは単にurllib2を使用して、localhost:somePortに対してPOSTまたはGETリクエストを行います。クライアントとサーバーは、ポート番号(およびURL)について合意する必要があります。

これは実装が非常に簡単で、非常にスケーラブルです。新しいコマンドを追加するのは簡単な作業です。

デーモンがHTMLで応答する必要はないことに注意してください(ただし、多くの場合、これは単純です)。デーモンは、JSONでエンコードされたステータスオブジェクトを使用してWSGIリクエストに応答します。

于 2009-03-18T10:26:16.830 に答える
9

名前付きパイプでツイストを使用するか、単にソケットを開きます。エコー サーバーとクライアントの例を見てください。クライアントから渡された文字列をチェックし、要求された情報で応答するようにエコー サーバーを変更する必要があります。

Python のスレッド化の問題により、情報要求への応答に問題が発生すると同時に、デーモンが意図したことを実行し続けることになります。非同期手法または別のプロセスのフォークが唯一の現実的な選択肢です。

于 2009-03-18T05:04:08.913 に答える
7
# your server

from twisted.web import xmlrpc, server
from twisted.internet import reactor

class MyServer(xmlrpc.XMLRPC):

    def xmlrpc_monitor(self, params):        
        return server_related_info

if __name__ == '__main__':
    r = MyServer()
    reactor.listenTCP(8080, Server.Site(r))
    reactor.run()

クライアントは xmlrpclib を使用して記述できます。サンプル コードはこちらで確認してください。

于 2009-03-18T05:38:27.460 に答える
5

Assuming you're under *nix, you can send signals to a running program with kill from a shell (and analogs in many other environments). To handle them from within python check out the signal module.

于 2009-03-18T04:47:33.040 に答える
5

Python リモート オブジェクトである Pyro ( http://pythonhosted.org/Pyro4/ ) に関連付けることができます。Python オブジェクトにリモートでアクセスできます。実装が簡単で、オーバーヘッドが少なく、Twisted ほど侵襲的ではありません。

于 2009-03-18T13:58:35.977 に答える