渣渣飞
渣渣飞,长年在票圈深夜放毒,是网易游戏高级运维工程师,对代码性能及系统原理饶有兴趣,三人行,必有我师。现负责监控相关业务开发。
前言
使用 Python 都不会错过线程这个知识,但是每次谈到线程,大家都下意识说 GIL 全局锁,
但其实除了这个老生常谈的话题,还有很多有价值的东西可以探索的,譬如:setDaemon()。
线程的使用 与 存在的问题
我们会写这样的代码来启动多线程:
1import time
2import threading
3
4def test():
5 while True:
6 print threading.currentThread()
7 time.sleep(1)
8
9if __name__ == '__main__':
10 t1 = threading.Thread(target=test)
11 t2 = threading.Thread(target=test)
12 t1.start()
13 t2.start()
输出:
1^C
2
3^C^C^C^C^C^C # ctrl-c 多次都无法中断
4
5^C
6
7
8
9
10...(两个线程竞相打印)
通过 Threading 我们可以很简单的实现并发的需求,但是同时也给我们带来了一个大难题: 怎么退出呢?
在上面的程序运行中,我已经尝试按了多次的 ctrl-c,都无法中断这程序工作的热情!最后是迫不得已用 kill 才结束。
那么怎样才能可以避免这种问题呢?或者说,怎样才能在主线程退出的时候,子线程也自动退出呢?
守护线程
有过相似经验的老司机肯定就知道,setDaemon() 将线程搞成 守护线程 不就得了呗:
1import time
2import threading
3
4def test():
5 while True:
6 print threading.currentThread()
7 time.sleep(1)
8
9if __name__ == '__main__':
10 t1 = threading.Thread(target=test)
11 t1.setDaemon(True)
12 t1.start()
13
14 t2 = threading.Thread(target=