青菏泉 2026-01-15 21:53 采纳率: 0%
浏览 1

关于Process的问题


from multiprocessing import Process
from time import sleep

def task1():
    while True:
        sleep(1)
        print('任务1运行中...')

def task2():
    while True:
        sleep(1)
        print('任务2运行中......')

if __name__ == '__main__':
    try:
        p1 = Process(target=task1, name='任务一')
        p1.start()
        p2 = Process(target=task2, name='任务二')
        p2.start()
    except Exception as e:
        print(f"Process error: {e}")

请问:以上代码,不执行(即task1和task2不打印),也不报错,请问问题出在哪里?多谢了

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-15 21:54
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提供的代码看起来逻辑上是正确的,但根据你的描述,“任务1和task2不打印,也不报错”,这说明程序虽然没有报错,但任务并没有真正运行。我们来分析可能的原因,并给出解决方案。


    问题分析

    1. 主进程提前退出

    在使用 multiprocessing.Process 时,如果主进程(即 if __name__ == '__main__': 块)执行完毕,那么它会自动终止所有子进程,即使这些子进程还在运行中。

    在你的代码中,主进程在启动两个子进程后,立即退出了,导致子进程被强制终止,因此任务不会打印任何内容。

    关键点: 主进程执行完 if __name__ == '__main__': 后就结束了,子进程还没来得及运行就被终止了。


    2. 子进程没有阻塞主进程

    由于主进程没有等待子进程完成,它会直接退出,导致子进程被系统终止。


    解决方案

    重点解决方案:

    你需要让主进程等待子进程结束,或者至少保持主进程运行一段时间,以便子进程有机会执行。

    方法一:使用 join() 等待子进程

    from multiprocessing import Process
    from time import sleep
    
    def task1():
        while True:
            sleep(1)
            print('任务1运行中...')
    
    def task2():
        while True:
            sleep(1)
            print('任务2运行中......')
    
    if __name__ == '__main__':
        try:
            p1 = Process(target=task1, name='任务一')
            p1.start()
            p2 = Process(target=task2, name='任务二')
            p2.start()
    
            # 让主进程等待子进程
            p1.join()
            p2.join()
        except Exception as e:
            print(f"Process error: {e}")
    

    加粗说明: 使用 join() 是最常见、最安全的方式,确保主进程不会提前退出,从而保证子进程能正常执行。


    方法二:使用 sleep() 暂停主进程

    如果你只是想测试一下,可以简单地让主进程暂停几秒,给子进程运行的时间:

    from multiprocessing import Process
    from time import sleep
    
    def task1():
        while True:
            sleep(1)
            print('任务1运行中...')
    
    def task2():
        while True:
            sleep(1)
            print('任务2运行中......')
    
    if __name__ == '__main__':
        try:
            p1 = Process(target=task1, name='任务一')
            p1.start()
            p2 = Process(target=task2, name='任务二')
            p2.start()
    
            # 让主进程等待几秒钟
            sleep(5)  # 5秒后退出
        except Exception as e:
            print(f"Process error: {e}")
    

    加粗说明: 这种方式适合调试,但不推荐用于生产环境,因为无法精确控制子进程的生命周期。


    有序列表总结问题原因与解决方法

    1. 主进程提前退出

      • 原因:主进程在启动子进程后立刻退出,导致子进程被强制终止。
      • 解决:使用 join()sleep() 阻止主进程过早退出。
    2. 子进程没有阻塞主进程

      • 原因:主进程未等待子进程完成,导致子进程未运行。
      • 解决:调用 p1.join()p2.join()
    3. 长时间运行的任务未被中断

      • 原因:task1task2 是无限循环,如果没有退出机制,程序会一直运行。
      • 解决:添加退出条件或使用 Ctrl+C 终止程序。

    修改后的代码示例(推荐)

    from multiprocessing import Process
    from time import sleep
    
    def task1():
        for i in range(5):  # 限制任务次数,避免无限循环
            sleep(1)
            print('任务1运行中...')
    
    def task2():
        for i in range(5):
            sleep(1)
            print('任务2运行中......')
    
    if __name__ == '__main__':
        try:
            p1 = Process(target=task1, name='任务一')
            p1.start()
            p2 = Process(target=task2, name='任务二')
            p2.start()
    
            # 等待子进程完成
            p1.join()
            p2.join()
        except Exception as e:
            print(f"Process error: {e}")
    

    加粗说明: 上面的修改版本添加了有限次循环,防止无限运行,同时使用 join() 确保主进程等待子进程完成。


    如有其他问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日