You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:05:15