我试图通过使用多处理库创建进程来在后台运行所有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()
终止进程,但发生了同样的问题。
答案 0 :(得分:0)
首先观察一下,您不需要 多处理 模块来完成您在此处所做的工作。 子流程 用于创建和管理将运行其他脚本和程序的进程; 多处理 用于创建和管理将调用已经在您的(父)脚本内部的代码的进程。
我怀疑你看到了缓冲的效果。当您终止此过程时,它已经将大量音乐缓存到硬件(甚至是设备的OS缓冲区)。
如果您从shell启动相同的程序 omxplayer 会发生什么,但在后台(作为 &amp; 令牌到底)您的Unix shell命令行将程序推送到后台)。然后在该过程中使用 kill 命令,看看是否看到相同的结果。