import threading
import time
def foo1():
try:
1/0
finally:
print('foo1 fin')
def foo2():
time.sleep(4)
try:
foo1()
finally:
print('foo2 fin')
while True:
time.sleep(1)
t = threading.Thread(target=foo2)
t.start()#子线程
while True:#主线程
time.sleep(1)
print('-------------')
if t.is_alive():
print('alive')
else:
print('dead')
运行结果:
-------------
alive
-------------
alive
-------------
alive
foo1 fin
foo2 fin
-------------
alive
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/home/yzx/PycharmProjects/python/t32.py", line 14, in foo2
foo1()
File "/home/yzx/PycharmProjects/python/t32.py", line 6, in foo1
1/0
ZeroDivisionError: division by zero
-------------
dead
-------------
dead
-------------
dead
-------------
dead
-------------
dead#一直持续打印dead,所以子进程产生异常中断了子进程,但并不影响主线程的继续执行
案例二:
import threading
import time
def foo1():
try:
1/0
finally:
print('foo1 fin')
def foo2():
time.sleep(4)
try:
foo1()
finally:
print('foo2 fin')
while True:
time.sleep(1)
# t = threading.Thread(target=foo2)
# t.start()
while True:
time.sleep(1)
print('-------------')
foo2()
# if t.is_alive():
# print('alive')
# else:
# print('dead')
运行结果:
-------------
foo1 fin
Traceback (most recent call last):
foo2 fin
File "/home/yzx/PycharmProjects/python/t32.py", line 26, in <module>
foo2()
File "/home/yzx/PycharmProjects/python/t32.py", line 14, in foo2
foo1()
File "/home/yzx/PycharmProjects/python/t32.py", line 6, in foo1
1/0
ZeroDivisionError: division by zero
Process finished with exit code 1 #主线程产生了小异常中断了主线程的执行,在生产环境中意味着当前程序主线程崩溃,为避免此类生产事故发生把一些不重要的代码放进子线程单独跑!