2011-08-11 68 views
2

我希望在收到請求後在後臺運行一個長時間運行的腳本。我閱讀了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部。這是做這件事的正確方法嗎?

+0

嘗試'if request.method =='POST'and request.POST.get('type')=='3'and request.POST.get('cc ')=='1':'並且保存你自己的兩個縮進級別。另外,因爲你在'try'中返回,所以只需執行'except:pass'並將這些東西移出一個縮進級別。它會使所有事情都更容易閱讀。 – agf

+0

我不確定爲什麼'subprocess.Popen'不能工作。它不會停止執行繼續? – agf

+0

@agf,是的,從我在帖子中的鏈接看到的,它會阻止,直到子進程的執行完成。 – goh

回答

4

是的,不要這樣做,請改用celery。它使運行異步任務變得更容易,更可靠。

+1

芹菜似乎只是運行1個腳本的矯枉過正.. – goh

+1

@amateur你總是可以認爲這是一個很好的學習任務,因爲你可能想在另一個項目中再次使用它? –

+0

嗯,你們可能是對的。我應該考慮拿起芹菜。 – goh

1

如果你不想使用類似celery的異步任務隊列,你總是可以通過cron運行一個python腳本。有幾個選項可以做到這一點。舉個例子:

  • 創建一個模型,它保存這是由你的過程需要
  • 寫一個獨立的Python/Django的腳本,它從模型得到的數值的數值,被執行人任務,並刪除數據庫條目
  • 設置一個cronjob來運行您的腳本