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

如何在Python3 Multiprocessing中保持无任务主线程的进程存活

解决Python多进程中子线程未完成进程就退出的问题

这是个非常典型的多进程与多线程协作的坑——当进程的主线程执行完毕时,整个进程会立刻终止,完全不会等待它的子线程执行完成。你代码里的new_proc_main函数启动两个线程后就直接结束了,主线程一退出,整个新进程就跟着挂掉,那两个刚启动的子线程自然也被强制终止了。

想要让新进程保持存活,核心就是让进程的主线程不要提前退出,这里有两种常用的解决方案:

1. 等待所有子线程执行完成

最简单的方式就是在主线程里调用子线程的join()方法,让主线程阻塞直到子线程全部跑完:

import multiprocessing
import threading

def xxxx():
    # 这里是你的线程业务逻辑,比如模拟耗时操作
    import time
    print(f"线程 {threading.current_thread().name} 开始执行")
    time.sleep(5)
    print(f"线程 {threading.current_thread().name} 执行完成")

def new_proc_main():
    thread1 = threading.Thread(target=xxxx, name="thread1")
    thread1.start()
    thread2 = threading.Thread(target=xxxx, name="thread2")
    thread2.start()
    
    # 关键:等待两个子线程都执行完毕
    thread1.join()
    thread2.join()
    # 到这里所有子线程都做完了,主线程才会结束,进程随之退出

if __name__ == "__main__":
    new_process = multiprocessing.Process(target=new_proc_main, name="yyy")
    new_process.start()

join()方法会让主线程暂停执行,直到对应的子线程完成任务。这样新进程的主线程会一直存活,直到两个子线程都跑完才会退出。

2. 让主线程持续存活(适用于守护线程场景)

如果你的子线程是需要长期运行的后台服务(比如监听消息队列、处理定时任务),可以把它们设为守护线程,然后让主线程进入一个无限循环,保持进程存活:

import multiprocessing
import threading
import time

def xxxx():
    # 模拟长期运行的后台任务
    while True:
        print(f"线程 {threading.current_thread().name} 正在运行...")
        time.sleep(2)

def new_proc_main():
    # 设置daemon=True,让线程成为守护线程——进程退出时会自动终止这些线程
    thread1 = threading.Thread(target=xxxx, name="thread1", daemon=True)
    thread1.start()
    thread2 = threading.Thread(target=xxxx, name="thread2", daemon=True)
    thread2.start()
    
    # 主线程保持存活,比如等待用户中断(Ctrl+C)
    try:
        while True:
            time.sleep(1)  # 避免空循环占用过多CPU资源
    except KeyboardInterrupt:
        print("收到中断信号,进程准备退出...")

if __name__ == "__main__":
    new_process = multiprocessing.Process(target=new_proc_main, name="yyy")
    new_process.start()
    new_process.join()  # 可选:让主进程也等待子进程结束

这里要注意:

  • 守护线程不能持有需要手动清理的资源(比如打开的文件句柄、数据库连接),因为进程退出时它们会被强制终止,没有机会执行收尾操作。
  • 主线程的无限循环里最好加个time.sleep(),不然会把CPU占满。

额外小提示

你代码里的线程命名有个小问题:name=thread1应该改成name="thread1",不然会把变量thread1的内存地址当成线程名,而不是你想要的字符串名称。

内容的提问来源于stack exchange,提问作者leopoodle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:43:36