2011-07-20 29 views
0

我正在使用用戶點擊的django項目提交一組需要在後端處理的圖像。即使在主線程使用Django終止之後運行線程

圖片已經上傳到服務器上,但一旦用戶點擊提交,處理請求需要大量時間,大約15秒鐘,直到顯示「謝謝您使用我們的消息」。

我想要做的是將流程中耗時的部分放入不同的線程,並立即顯示感謝信息。我的代碼如下所示:

def processJob(request): 
    ... 
    threading.Thread(target=processInBackground, args=(username, jobID)).start() 
context = {} 
context.update(csrf(request)) 
return render_to_response('checkout.html', context) 

def processInBackground(username, jobID): 
... 
    (processing the rest of the job) 

但是,一旦我運行它:它會創建一個新的線程,但它會終止主線程終止的秒數。有什麼辦法可以在後端處理這些東西,而用戶馬上得到感謝信息?

+0

「進程耗時的部分進入不同的線程」。總是錯誤的做法。你不想要一個線程。你想要一個過程。 –

+0

不,在單獨的Django中沒有辦法做到這一點。您可以使用[芹菜](http://celeryproject.org/)[附加信息的博客文章](http://www.turnkeylinux.org/blog/django-celery-rabbitmq) –

回答

0
PROCESSORS = [] # empty list of background processors 

繼承Trheading.thread

class ImgProcessor(threading.Thread): 
    def __init__(self, img, username, jobID): 
     self.img = img 
     self.username = username 
     self.jobID = jobID 
     threading.Thread.__init__(self) 
     self.start() 
     self.readyflag = False 

    def run(self): 
     ... process the image ... 
     self.readyflag = True 

然後,發送請求時:

def processJob(request): 
    PROCESSORS.append(ImgProcessor(img, username, jobID)) 
    .... remove all objects in PROCESSORS that have readyflag == True 
0

這不一定是你要找的東西,但我的攝影師網站我們使用Javascript(使用PLUpload)異步上傳照片,這允許我們一次回調多個照片上傳狀態。上傳完成後,文件將保存到具有唯一名稱的文件夾中,並保存到數據庫隊列中,然後由cron作業拾取該文件,該作業通過隊列運行以處理尚未完成的任何內容,然後對其進行處理。我使用的是Django的自定義管理命令,因此我得到了Django框架的所有優點,減去了Web部分。

這樣做的好處是您可以獲得每次上傳的記錄,您可以使用輪詢請求顯示狀態,並且您可以根據需要在任何希望的服務器上執行處理。