一、前言:
学无止境,在学习线程的理论及使用方法时,有以下文章及代码为我提供了很大帮助,特此附上链接,感谢大佬们!希望对您也有参考借鉴的意义!
二、学习笔记 / 翻译分析
三、个人笔记
1. 希望能通过主线程杀死子线程的方法:setDaemon守护进程。
使用setDaemon()和守护线程这方面知识有关, 比如在启动线程前设置thread.setDaemon(True),就是设置该线程为守护线程,
表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免孤儿进程。
thread.setDaemon()设置为True, 则设为true的话 则主线程执行完毕后会将子线程回收掉,
设置为false,主进程执行结束时不会回收子线程。
setDaemon()说明:
setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;
设为True相当于像主线程中注册守护,主线程结束时会将其一并回收。
代码示例:
## --- 服务端部分代码 ---
# 创建新线程
thread1 = myThread('ini_model')
# 开启新线程,初始化模型
thread1.setDaemon(True)
thread1.start()
# 与客户端通信(正常情况为无限循环型,当break时退出)
connect_client()
# 关闭服务端(自动回收子线程threa1)
exit(0)
2. python线程的GIL问题 (全局解释器锁)
什么是GIL :由于python解释器设计中加入了解释器锁,导致python解释器同一时刻只能解释执行一个线程,大大降低了线程的执行效率。
导致后果: 因为遇到阻塞时线程会主动让出解释器,去解释其他线程。所以python多线程在执行多阻塞高延迟IO时可以提升程序效率,其他情况并不能对效率有所提升。
GIL问题建议
- 尽量使用进程完成无阻塞的并发行为
- 不使用c作为解释器 (Java C#)
结论 : 在无阻塞状态下,多线程程序和单线程程序执行效率几乎差不多,甚至还不如单线程效率。但是多进程运行相同内容却可以有明显的效率提升。