我有以下测试代码子类化 多处理过程:
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 秒,这可能足以让B
和C
获得一些爱;-)在他们被杀死之前从操作系统。