0

序文

Cで書かれたプログラムへのアクセスをユーザーに提供するWebサーバーを作成しています(このCプログラムでPythonラッパーを使用しています、それはPyCLIPS です)。多くのユーザーにサービスを提供するには、Web サーバーはこの C プログラムの多くのコピーを開始する必要があります。これは、1 つのコピーが同時に非常に少数のユーザー (約 1 ~ 3 ユーザー) にサービスを提供できるためです。さらに、各ユーザーは自分のコピーのみを使用して作業する必要があるため、C プログラムのコピーが多数存在する必要があります。

この C プログラムは、理解するのに役立つ場合はCLIPS エンジンです。


したがって、この設計上の問題を解決するために、長時間実行されるプロセスのプールのような Twisted TCP サーバーを書きたいと思います。long-running-processes のそれぞれは、C プログラムの 1 つのコピーへのアクセスを提供する小さな Twisted TCP サーバーです。

たとえば、ユーザーがプールサーバーに長時間実行プロセスを予約するように依頼すると、プールサーバーは長時間実行プロセスを作成して実行し、ポートでリッスンを開始すると、プールサーバーはホストを返しますこの長時間実行プロセスをユーザーに移植します。これで、ユーザーはこの長期実行プロセスと直接通信できます。


質問

  1. これらの長時間実行プロセスをプール サーバーから開始するにはどうすればよいですか? プールサーバーと各長時間実行プロセスは、別々の Twisted サーバーにする必要があります。
  2. Twisted はこれらの目的に適していますか?
  3. この設計上の問題を解決する別の方法があるのではないでしょうか?

どうもありがとう。

4

1 に答える 1

4

これに Twisted を使用するのは理にかなっているように思えます。Twisted でのプロセスの実行をサポートする低レベル API は、reactor.spawnProcessです。使用方法のいくつかの例は、プロセスのハウツードキュメントに記載されています。

この API は、長時間実行される多くのプロセスを処理するのに適しています。また、Twisted のすべての I/O API と同様に、別のイベント ソース (ユーザーが新しいプロセスの開始を要求するために使用できるWeb サーバーなど) と組み合わせるとうまく機能します。

reactor.spawnProcessmultiprocessingパッケージというよりは、標準ライブラリの subprocess モジュールに似ています。特定の引数などを使用して、特定の実行可能ファイルを実行する子プロセスを起動する方法を提供します。別のプロセスで特定の Python 関数を実行するための高レベル API は提供しません。ただし、そのようなものを作成するのはそれほど難しくありません (少なくとも特定のケースでは)。次のアプローチを検討してください。

from sys import executable
from os import environ

from twisted.internet import reactor

implementation = """\
from yourapp import somefunction
somefunction()
"""

reactor.spawnProcess(executable, [executable, "-c", implementation], env=environ)
reactor.run()

これにより、新しい Python インタープリター (実行中のいずれか) が起動され、 -c オプションを使用して、コマンド ラインでプログラムを実行するように指定されます。

于 2011-08-27T15:07:38.193 に答える