情景描述
在执行下面这个测试用例时,在多种运行环境下出现了两种截然不同的执行结果。为了备忘先记录下来,后续再分析。
import time
from multiprocessing import Process
from threading import Thread
def run1():
print('子进程开始')
p = Thread(target=run2)
p.start()
print('子进程结束')
def run2():
print('子子线程开始')
time.sleep(5)
print('子子线程结束')
if __name__ == '__main__':
print('主进程开始')
subthreading = Process(target=run1)
subthreading.start()
print('主进程结束')
上面的代码,由主进程创建子进程,子进程再创建子子线程。
执行结果1
① CentOS7+Python3.6.5
② Ubuntu16+Python3.6.8
主进程开始
主进程结束
子进程开始
子子线程开始
子进程结束
可以看出,子子线程本身并没有执行完,而是随着子进程的结束而结束。
执行结果2
Ubuntu16+Python3.7.0
windows10+Python3.6.2
windows10+Python3.7.4
CentOS7+Python3.7.1
主进程开始
主进程结束
子进程开始
子子线程开始
子进程结束
(等待5秒)
子子线程结束
与上面不同,这里的子子线程并没有随子进程结束而结束,而是自己独立执行完了。
观察结果
经过几种尝试,发现:
- 在Windows环境下,3.6和3.7都是能执行完;
- 在类Unix环境下,3.6不能执行完,而3.7能执行完;
分析原因
先挖坑,以后再说。
结论
在服务器跑程序还是优先用python3.7吧,避免类似这样的bug。