我希望在收到請求後在後臺運行一個長時間運行的腳本。我閱讀了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')
我用os.fork從另一post建議但顯然控制不流入我if pid == 0
部。這是做這件事的正確方法嗎?
嘗試'if request.method =='POST'and request.POST.get('type')=='3'and request.POST.get('cc ')=='1':'並且保存你自己的兩個縮進級別。另外,因爲你在'try'中返回,所以只需執行'except:pass'並將這些東西移出一個縮進級別。它會使所有事情都更容易閱讀。 – agf
我不確定爲什麼'subprocess.Popen'不能工作。它不會停止執行繼續? – agf
@agf,是的,從我在帖子中的鏈接看到的,它會阻止,直到子進程的執行完成。 – goh