LinuxでDjangoを実行していて、ビューを取得していて、そのサブプロセスのデータをlikeso例えば、ビューが作成したファイルで動作CMD:今Djangoでは、起動時間が遅いサブプロセスを呼び出す方法
def call_subprocess(request):
response = HttpResponse()
with tempfile.NamedTemporaryFile("W") as f:
f.write(request.GET['data']) # i.e. some data
# cmd operates on fname and returns output
p = subprocess.Popen(["cmd", f.name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
response.write(p.out) # would be text/plain...
return response
、CMDは非常に遅い起動時間を持っていると仮定しますが、非常に高速な動作時間、およびそれネイティブにデーモンモードはありません。私はこの見解の応答時間を改善したいと思います。
私は彼らが入力を待つ必要があり、かつは1を尋ねるcall_processを持つ、システム全体がはるかに高速労働者、プール内のcmdをのインスタンスの数を起動して実行しますしたいと思いますそれらのワーカー・プール・プロセスのうちの1つがデータを処理します。
パートCMD、入力用CMD待機を呼び出し1関数:
これは実際に2重量部です。これは
def _run_subcmd():
p = subprocess.Popen(["cmd", fname],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# write 'out' to a tmp file
o = open("out.txt", "W")
o.write(out)
o.close()
p.close()
exit()
def _run_cmd(data):
f = tempfile.NamedTemporaryFile("W")
pipe = os.mkfifo(f.name)
if os.fork() == 0:
_run_subcmd(fname)
else:
f.write(data)
r = open("out.txt", "r")
out = r.read()
# read 'out' from a tmp file
return out
def call_process(request):
response = HttpResponse()
out = _run_cmd(request.GET['data'])
response.write(out) # would be text/plain...
return response
は、第2部、すなわち
、パイプを使用してデータを待機しているバックグラウンドで実行されている労働者のセットを行うことができます。つまり、サブプロセスが既に実行中であるように上記を拡張したいと考えています。 Djangoのインスタンスを初期化し、またはこのcall_processが最初に呼び出され、これらの労働者のセットがWORKER_COUNT = 6
WORKERS = []
class Worker(object):
def __init__(index):
self.tmp_file = tempfile.NamedTemporaryFile("W") # get a tmp file name
os.mkfifo(self.tmp_file.name)
self.p = subprocess.Popen(["cmd", self.tmp_file],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.index = index
def run(out_filename, data):
WORKERS[self.index] = Null # qua-mutex??
self.tmp_file.write(data)
if (os.fork() == 0): # does the child have access to self.p??
out, err = self.p.communicate()
o = open(out_filename, "w")
o.write(out)
exit()
self.p.close()
self.o.close()
self.tmp_file.close()
WORKERS[self.index] = Worker(index) # replace this one
return out_file
@classmethod
def get_worker() # get the next worker
# ... static, incrementing index
を作成しているどこかに、このような労働者のいくつかの初期化がなければならないとき:
def init_workers(): # create WORKERS_COUNT workers
for i in xrange(0, WORKERS_COUNT):
tmp_file = tempfile.NamedTemporaryFile()
WORKERS.push(Worker(i))
今、私が上に持っているものは何かになる:
今質問:
これは機能しますか? (私はちょうどStackOverflowに私の頭の上にこれをタイプしたので、問題があると確信していますが、概念的にはうまくいくでしょう)
何が問題ですか?
これに代わる方法はありますか?例えばスレッドも同様に動作します(Debian Lenny Linuxです)。このような並列プロセスワーカープールを扱うライブラリはありますか?
私が意識しているはずのDjangoとのやり取りはありますか?
ありがとうございました!これが私のように面白い問題だと思ってください。
ブライアン
これは面白いです - 私はそれを調べるでしょう。しかし、私が(またはしていない)問題は、#2( "CMDがキューに追加される"、つまりLaTeXがデータを取得する)の前に、ステップ#4のパート1( "実行されています"、つまりLaTeXが開始されている) )。しかし、私はかなりセロリがこれを行うことができると確信していますが、それは少しの掘り下げを必要とします。ありがとうAsksol。 –