私は、要求を受け取ったときにバックグラウンドで長時間実行するスクリプトを実行したいと考えています。私はsubprocess
について読んでいますが、要求が時間通りに完了できるように、呼び出しが非ブロックであることが必要です。django:os.forkを使ってバックグラウンドプロセスを作成しますか?
def controlCrawlers(request):
if request.method == 'POST' and 'type' in request.POST and 'cc' in request.POST:
if request.POST['type'] == '3':
if request.POST['cc'] == '1':
try: #temp solution checking socket is occupied by trying to connect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',DISCOVERY_SOCKET))
s.close()
return HttpResponse(simplejson.dumps({'success':0,'message': 'Socket is occupied. Possible crawler is already running'}), \
mimetype='application/json')
except:
pid = os.fork()
if pid == 0:
#f = open('/home/foo/django','a')
#f.write('abc')
# f.close()
path = os.path.join(os.path.dirname(__file__), 'blogcontentReader/blogpost_crawler.py')
os.system("python %s" %path)
os._exit(0)
return HttpResponse(simplejson.dumps({'success':1,'message': 'Running...'}), \
mimetype='application/json')
私は別のpostから提案されているようos.forkを使用どうやら私のif pid == 0
部分に流入しない制御します。これを行う正しい方法ですか?
if request.method == 'POST'とrequest.POST.get( 'type')== '3'とrequest.POST.get( 'cc ')==' 1 ': 'とあなた自身の2つのインデントレベルを保存します。また、 'try'で返ってきたので、' except:pass'を実行して、インデントレベルからその項目を移動してください。それはすべてを読みやすくします。 – agf
なぜ 'subprocess.Popen'が動作しないのか分かりません。執行が中断されることはありませんか? – agf
@agf、確かに、私のポストのリンクから見ると、子プロセスの実行が完了するまでブロックされます。 – goh