请解释一下提前终止多进程的原因.进程子类



我有以下测试代码子类化 多处理过程:

import multiprocessing as mp
class TestProcess(mp.Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def run(self):
        while True:
            print('{} says "I am alive"'.format(self.name))
if __name__ == "__main__" :
    procs = [TestProcess(i) for i in list('ABC')]
    try:
        for p in procs:
            print('starting {}'.format(p.name))
            p.start()
    except KeyboardInterrupt:
        print('caught interrupt')
    except Exception as e:
        print(str(e))
    finally:
        for p in procs:
            print('stopping {}'.format(p.name))
            p.terminate()

由于某种原因,A 提前终止而不发送 ctrl + c,进程 B 和 C 似乎从未运行过:

host:~ user$ python process_example.py
    starting A
    starting B
    starting C
    A says "I am alive"
    [... x 16 lines]
    A says "I am alistopping A
    stopping B
    stopping C

如果有人能解释这一点,我将不胜感激。

更新

感谢大家的及时回复;我已经更新到以下内容:

import time
import multiprocessing as mp
class TestProcess(mp.Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def run(self):
        while True:
            print('{} says "I am alive"'.format(self.name))
            time.sleep(1)
if __name__ == "__main__" :
    procs = [TestProcess(i) for i in list('ABC')]
    try:
        for p in procs :
            print('starting {}'.format(p.name))
            p.start()
        for p in procs :
            print('joining {}'.format(p.name))
            p.join()
    except KeyboardInterrupt:
        print('caught interrupt')
    except Exception as e:
        print(str(e))
    finally:
        for p in procs :
            print('stopping {}'.format(p.name))
            p.terminate()

现在我得到:

host:~ user$ python process_example.py
starting A
starting B
starting C
A says "I am alive"
joining A
B says "I am alive"
C says "I am alive"
A says "I am alive"
B says "I am alive"
C says "I am alive"
A says "I am alive"
B says "I am alive"
C says "I am alive"
A says "I am alive"
B says "I am alive"
C says "I am alive"
A says "I am alive"
B says "I am alive"
C says "I am alive"
B says "I am alive"
A says "I am alive"
C says "I am alive"
^Ccaught interrupt
stopping A
stopping B
stopping C

所以只需要加入一个线程?

我不清楚你期望这样做做什么。 启动进程后,代码立即进入finally:块并显式终止所有进程。 所以他们当然会停下来。

至于为什么只有"A"说它是活的,这可能因平台(OS)而异。 您的run()方法只是一个"繁忙循环",尽可能快地不间断地打印。 这些进程在启动后很快就会被终止,以至于在您的平台上,操作系统在您终止其他进程之前从未为它们安排时间片。

例如,尝试在启动进程的循环之后粘贴一个time.sleep(10)。 这将延迟杀死进程 10 秒,这可能足以让BC获得一些爱;-)在他们被杀死之前从操作系统。

最新更新