2014-10-18 15 views
1

使用django按鈕,我需要啓動多個音樂(隨機選擇)。django子流程p.wait()不返回網頁

在我的models.py,我有兩個功能「playmusic」和「playmusicrandom」:

def playmusic(self, music): 
    if self.isStarted(): 
     self.stop() 

    command = ("sudo /usr/bin/mplayer "+music.path) 
    p = subprocess.Popen(command+str(music.path), shell=True) 
    p.wait() 


def playmusicrandom(request):  
    conn = sqlite3.connect(settings.DATABASES['default']['NAME']) 
    cur = conn.cursor() 
    cur.execute("SELECT id FROM webgui_music") 
    list_id = [row[0] for row in cur.fetchall()] 

    ### Get three IDs randomly from the list ### 
    selected_ids = random.sample(list_id, 3) 

    for i in (selected_ids): 
     music = Music.objects.get(id=i) 
     player.playmusic(music) 

有了這個代碼,三級的音樂播放(一個接一個),但網頁是剛「Loading ...」在執行過程中...
有沒有一種方法可以在循環期間向用戶顯示刷新的網頁? 謝謝。

回答

1

在等待playmusicrandom()完成時,您的視圖被阻止將任何內容返回到Web服務器。

您需要安排playmusicrandom()完成其任務您從視圖返回了HTTP狀態。

這意味着您可能需要一個線程(或類似的解決方案)。

您的視圖將有這樣的事情:

import threading 

t = threading.Thread(target=player_model.playmusicrandom, 
          args=request) 
t.setDaemon(True) 
t.start() 
return HttpResponse() 

此代碼片段來自here,在那裏你會找到你所面臨的問題和可能的解決方案的更多詳細信息。

+0

太棒了!謝謝,它有效。只是,我的硬件在'cat/proc/cpuinfo'(樹莓派)中列出了一個處理器。哪種方法更適合? (線程,多進程等)。 – Isador 2014-10-18 13:41:08

+0

聽起來像線程是給你的。 – GreenAsJade 2014-10-18 23:28:24

+0

很抱歉發佈了一個關於此解決方案的問題,它可以工作,但是我的停止功能僅停止當前的mplayer進程(pkill),並且我會殺死整個線程,但是我已經看到這不是真的有可能......?你有好主意嗎 ? – Isador 2014-10-25 08:51:01