2012-03-13 6 views
0

私はPythonを初めて使いました。私は非同期呼び出しとWebサーバーに関するいくつかの問題を抱えています。バックグラウンドサービス、SimpleHTTPServer、AJAX

私はSimpleHTPServerをAJAX経由でWebサイトと通信しています。このWebサイトでは、ホスト内のサービスを開始および停止できます。

問題は、コールが終了するまで私のHTTP:201が取得されないことです。これは、これが長時間実行されるプロセスなので決して起こりません。

「cmd &」を実行しているシェルスクリプトの中に私のcmdを持っていて、ポケンと一緒に試してみましたが、私は非ブロッキングでした。

私も、引数は(os.system、(CMD))thread.start_new_threadで試してみました

def do_POST(self): 
    # ... some code to get args ... 
    subprocess.Popen([cmd, args]) 

    # I'd like 'cmd args' to run in the server while I return my HTTP:201 here 
    self.send_response(201) 
    self.end_headers() 
    self.wfile.write(output) 

答えて

0

私はここに解決策を見つけた:エルス

Why does a background task block the response in SimpleHTTPServer?

def do_POST(self): 
    # ... some code to get args ... and output ... 
    subprocess.Popen([cmd, args]) 

    self.send_response(201) 
    self.send_header("Content-Length", str(len(output))) # This line does the trick! 
    self.end_headers() 
    self.wfile.write(output) 

をPythonはバックグラウンドコマンドが終了するまで開いているTCPコネクションを保持しています。 レスポンスの長さを指定すると、PythonはTCP FINを送信し、ブラウザはその人生を続けることができます:)

1

subprocess.Popenあなたは重要な何かを残してきたことを意味し、あなたのコードと同じ時刻に実行されますあなたの例。 1171552回/bin/sleep前にwhileループの周りに回転させ、Pythonが終了したことを意味

def demo(): 
    p = subprocess.Popen(['/bin/sleep', '2']) 
    n = 0 
    while p.poll() is None: 
     n+=1 
    return n 

print demo() # prints 1171552 on my machine... 

+0

ありがとうシェーン、あなたは絶対に正しいですが、プロセスは並行して実行されていましたが、適切に。あなたが好奇心が強いなら、自分の答えを見てください。 –

関連する問題