私は、バックグラウンドタスクを起動し、それから進行を得ることができるはずの単純なブラウザベースのフロントエンドを書いています。タスクが正常に起動したかどうかを示す応答をブラウザが受信し、ポーリングしていつ実行されたかを判断する必要があります。ただし、バックグラウンドタスクが存在するため、XMLHttpRequest応答がすぐに送信されないようであるため、プロセスの起動の成功を報告できません。次の(簡略化された)コードについて考えてみます。
import SocketServer
import SimpleHTTPServer
import multiprocessing
import time
class MyProc(multiprocessing.Process):
def run(self):
print 'Starting long process..'
for i in range(100): time.sleep(1)
print 'Done long process'
class Page(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
print >>self.wfile, "<html><body><a href='/run'>Run</a></body></html>"
if self.path == '/run':
self.proc = MyProc()
print 'Starting..'
self.proc.start()
print 'After start.'
print >>self.wfile, "Process started."
httpd = SocketServer.TCPServer(('', 8000), Page)
httpd.serve_forever()
これを実行してhttp:// localhost:8000にアクセスすると、「実行」という名前のボタンが表示されます。それをクリックすると、ターミナルに次のように表示されます。
Starting..
After start.
ただし、ブラウザの表示は変わりません。実際、カーソルは回転しています。ターミナルでCtrl-Cを押してプログラムを中断した場合にのみ、ブラウザは次のメッセージで更新されます。Process started.
メッセージAfter start
ははっきりと印刷されています。do_GET
したがって、プロセスを開始した後、それが戻ってきていると推測できます。それでも、長時間実行されているプロセスを中断するまで、ブラウザーは応答を受け取りません。との間に何かがブロックされていると結論付ける必要があります。do_GET
これは、内部にありSimpleHTTPServer
ます。
スレッドとsubprocess.Popenでもこれを試しましたが、同様の問題が発生しました。何か案は?