2

あるプログラムに HTTP サーバーがあり、別のプログラムに基本的なアプリケーションがあります。どちらもループなので、次の方法がわかりません。

  1. アプリを起動してから HTTP サーバーを起動するスクリプトを作成します。
  2. これらのプログラムが動作中にデータを交換するようにします。

これらは通常どのように行われますか?私のスクリプトは Python で書かれているので、Python ソリューションは本当にありがたいです。

  1. ユーザーは、アプリにデータを照会して結果を返す http 要求を行いますか? はい

  2. アプリはデータを収集してどこかに保存しますか? アプリと HTTP サーバーは両方とも SQLite データベースを使用します。ただし、DB は異なる場合があります。

4

6 に答える 6

3

a) os.systemを使用してアプリケーションを起動できます:


os.system("command")

または、subprocessモジュールを使用できます。詳細はこちら

b) ソケットを使用する

于 2009-04-28T13:01:40.757 に答える
3

おそらく、subprocessモジュールをそのまま使用できます。データの交換には、Popen.stdin および Popen.stdout ストリームを使用できる場合があります。もちろん、あなたが/できる/できる方法に制限はありません。 CORBADBUS共有メモリDCOP、リストは続きます。しかし、最初に簡単な方法を試してみてください。この場合は、通常の python パイプ/ストリームです。

于 2009-04-28T13:07:42.507 に答える
2

答える前に、もう少し情報が必要だと思います。

  1. ここに定義可能な情報のパイプラインはありますか?
    1. ユーザーは、アプリにデータを照会して結果を返す http 要求を行いますか?
    2. アプリはデータを収集してどこかに保存しますか?

実際の使用方法に応じて、いくつかのオプションがあります。ソケットはオプションであり、ファイルまたはデータベースを介して情報を渡します。

[編集]あなたの返信に基づいて、それを行う方法がいくつかあると思います。

  1. Web サーバーからアプリのデータベースにアクセスできる場合は、必要な情報をそこから簡単に取得できます。ここでも、交換したい情報が何であるかによって異なります。
  2. アプリが http サーバーに何らかの結果を与えるだけでよい場合は、それらを http サーバーのデータベースの結果テーブルに書き込むことができます。
  3. 他の人がバックグラウンドアプリと直接データを交換することを提案しているように、パイプまたはサブプロセスを使用してください。
  4. アプリが書き込み、http サーバーが読み取ることができるログ ファイルを使用します。

いくつかの質問:

  1. ここで双方向通信が必要ですか、それとも http サーバーが結果を表示するだけですか?
  2. どのウェブサーバーを使用していますか?
  3. どの処理言語を使用できますか?

2 つの部分の依存度に応じて、新しいアプリを作成してアプリのデータベースの変更をチェックし (フックやポーリングなどを使用)、関連情報を http サーバー自体のデータベースに投稿するのが最善の方法です。これには、多くの場合、良いことである 2 つの部分の結合が少なくなるという利点があります。

fastcgi モジュールを使用して Django アプリと通信する Web サーバー (Apache 2) があります。fastcgi の djangobook のセクションを見てください。Apache はソケット (または通常の tcp) を使用してバックグラウンド アプリ (Django) と通信します。

[編集 2]おっと - Web サーバーが python プロセス自体であることがわかりました。それがすべてpythonの場合、それぞれを独自のスレッドで起動し、両方のQueueオブジェクトを渡すことができます。これにより、2つのプロセスがブロックまたは非ブロックのいずれかの方法で相互に情報を送信できるようになります。

于 2009-04-28T13:05:31.107 に答える
1

多分ツイストはあなたが探しているものです

于 2009-04-28T13:42:09.477 に答える
1

目的に応じて、os.mkfifo を使用して名前付きパイプを作成し、2 つのプログラム間でデータを共有できます。

http://mail.python.org/pipermail/python-list/2006-August/568346.html

于 2009-04-28T13:04:44.247 に答える
0

Python で Web アプリケーションを作成するときは、常に Web サーバーをバックグラウンド タスクと同じプロセスに置いています。あなたが使用している Web サーバーはわかりませんが、個人的にはCherryPyを使用しています。アプリケーションは、バックグラウンド タスクとして必要なその他の多くのスレッドを使用して、多数のスレッドを Web サーバーにすることができます。この方法では、ソケットや名前付きパイプなどを使用した複雑な IPC は必要ありません。代わりに、共有されたグローバルな同期データ構造にアクセスして情報を渡すだけで、さまざまなモジュールが相互に関数を直接呼び出すことができます。

編集:明確にするために、スレッドモジュールを使用して、他のブロッキングサーバーとは異なるスレッドでCherryPyサーバーを実行できます。例えば:

def listener():
    sock = get_socket_from_somewhere()
    while True:
        client, addr = sock.accept()
        # send data back to client, etc

from threading import Thread
t1 = Thread(target=listener)
t1.setDaemon(True)
t1.start()

cherrypy.quickstart() # you'd need actual arguments here

この例では、Web サーバー (この場合は CherryPy ですが、何でもかまいません) と同じプロセス内の 1 つのスレッドにブロッキング サーバーを配置する方法を示しています。

于 2009-04-28T13:28:34.640 に答える