流程没有终止

时间:2016-04-07 08:41:03

标签: python python-multiprocessing

我试图通过使用多处理库创建进程来在后台运行所有mp3文件。

import os
import subprocess
from multiprocessing import Process

def music_player():

    music_folder = "/home/pi/Music/"
    files = os.listdir(music_folder)
    for mp3_file in files:
        print("playing " + mp3_file)
        p = subprocess.Popen(["omxplayer","-o","local",music_folder+mp3_file],
                          stdout = subprocess.PIPE,
                          stdin = subprocess.PIPE,
                          stderr = subprocess.PIPE)
        print(p)
        print(p.poll())
        print(p.pid)
        p.wait()



p = Process(target = music_player)
print(p, p.is_alive())
p.start()
print(p.pid)
print(p, p.is_alive())
command = raw_input()
if(command == "stop"):
    print("terminating...")
    p.terminate()
    print(p, p.is_alive())
    print(p.exitcode)  

输入“停止”命令后代码退出但音乐仍然在运行并且在执行ps时我看到了omxplayer的2个进程,然后我必须通过kill <pid>手动终止以制作音乐停。

我之前尝试过使用子进程库并使用kill() and terminate()终止进程,但发生了同样的问题。

1 个答案:

答案 0 :(得分:0)

首先观察一下,您不需要 多处理 模块来完成您在此处所做的工作。 子流程 用于创建和管理将运行其他脚本和程序的进程; 多处理 用于创建和管理将调用已经在您的(父)脚本内部的代码的进程。

我怀疑你看到了缓冲的效果。当您终止此过程时,它已经将大量音乐缓存到硬件(甚至是设备的OS缓冲区)。

如果您从shell启动相同的程序 omxplayer 会发生什么,但在后台(作为 &amp; 令牌到底)您的Unix shell命令行将程序推送到后台)。然后在该过程中使用 kill 命令,看看是否看到相同的结果。