Multiprocessing:主进程执行完毕后仍未终止的问题咨询
问题原因与解决方案
为什么主进程不会终止?
你遇到的核心问题是Python的multiprocessing.Process默认会让主进程等待所有非守护子进程完成后才会退出。
当你设置k.daemon = False(这也是默认值),意味着这个子进程是「非守护进程」,主进程执行完所有代码后不会直接终止,而是会进入阻塞状态,一直等待这个子进程结束。哪怕你触发除零错误导致主进程崩溃,它的退出状态也会被父进程(比如你的终端shell)暂时保留,直到子进程结束或者手动回收,这就是你看到的僵尸进程状态。
如何让主进程退出,只留子进程运行?
要实现主进程启动子进程后立刻退出,同时让子进程继续运行,你有两种可靠的方案:
方案1:使用os.fork()(仅适用于Unix/Linux/macOS)
os.fork()会直接创建一个完全独立的子进程,主进程可以毫无顾虑地退出,子进程会被系统的init/systemd进程收养,继续执行播放逻辑:
import vlc from time import sleep import os def lul(): song = vlc.MediaPlayer("Himeringo - Shinitai-chan.mp3") song.audio_set_volume(50) song.play() sleep(5) while song.is_playing(): print('&') sleep(5) if __name__ == '__main__': pid = os.fork() if pid == 0: # 子进程:执行播放任务 lul() else: # 主进程:直接退出,不等待子进程 exit()
方案2:用os._exit()强制终止主进程(跨平台,更适合multiprocessing场景)
如果你想继续使用multiprocessing.Process,可以在启动子进程后用os._exit(0)直接终止主进程——这个方法会跳过Python的所有清理流程(包括等待非守护子进程的逻辑),让主进程立刻退出,子进程会变成孤儿进程继续运行:
import vlc from time import sleep from multiprocessing import Process import os def lul(): song = vlc.MediaPlayer("Himeringo - Shinitai-chan.mp3") song.audio_set_volume(50) song.play() sleep(5) while song.is_playing(): print('&') sleep(5) if __name__ == '__main__': k = Process(target=lul) k.daemon = False k.start() # 强制终止主进程,不执行任何清理操作 os._exit(0)
注意事项
- 如果你在Windows系统上运行代码,
os.fork()不可用,建议改用subprocess模块启动一个独立的Python脚本负责播放音乐,这样主脚本退出后不会影响播放进程。 - 子进程变成孤儿后,它的输出(比如你的
print('&'))会继续关联到原终端,直到终端关闭。如果需要完全脱离终端,可以考虑使用nohup或其他后台运行工具。
内容的提问来源于stack exchange,提问作者asdf asdf
相关产品推荐
相关产品推荐

