【问题标题】:django subprocess p.wait() doesn't return webdjango 子进程 p.wait() 不返回 web
【发布时间】:2014-10-18 12:38:20
【问题描述】:

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

在我的 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)

使用此代码,播放了三首音乐(一个接一个),但网页在执行期间只是“正在加载...”...
有没有办法在循环期间向用户显示刷新的网页? 谢谢。

【问题讨论】:

    标签: django subprocess


    【解决方案1】:

    在等待playmusicrandom() 完成时,您的视图被阻止向网络服务器返回任何内容。

    您需要安排playmusicrandom() 在您从视图返回HTTP 状态之后完成其任务。

    这意味着您可能需要一个线程(或类似的解决方案)。

    你的视图会是这样的:

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

    此代码 sn-p 来自here,您可以在其中找到有关您面临的问题和可能的解决方案的更多详细信息。

    【讨论】:

    • 太棒了!谢谢,它有效。只是,我的硬件在cat /proc/cpuinfo(树莓派)中列出了一个处理器。哪种方法更值得推荐? (线程、多进程等...)。
    • 很抱歉发布有关此解决方案的问题,它有效,但我的停止功能仅停止当前的 mplayer 进程(pkill),我想杀死整个线程,但我已经看到这是真的不可能……?你有什么想法吗?
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多