在django中停止mplayer线程

时间:2014-10-21 04:04:24

标签: python django multithreading mplayer

使用django按钮,我需要启动多重音​​乐(随机选择)。

在我的models.py中,我有两个函数'playmusic'和'playmusicrandom':

class Player()
    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)


    def stop(self):
        """
        Kill mplayer process
        """
        p = subprocess.Popen("sudo killall mplayer", shell=True)
        p.communicate()

在我的观点中,我使用一个线程来调用'playmusicrandom':

def playmusicrandom(request):
player = Player()
#player.playmusicrandom()
t = threading.Thread(target=player.playmusicrandom)
t.setDaemon(True)
t.start()

return redirect('homepage')

因此,当我点击播放时,会播放三个音乐(一个接一个)。 但是当我点击停止时,显然,当前的mplayer进程被终止,第二个进程被播放......

我读过这不是一个好主意,但在我的情况下是否有一个解决方案来停止在视图中启动的线程? 谢谢。

PS:我想避免将停止改为'杀死,睡觉,杀人等......'

1 个答案:

答案 0 :(得分:0)

根据我的经验,在django应用程序中进行后台处理的最佳方法是使用芹菜。请查看http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html,看看您需要在设置中包含它。