文章目录
一、线程和python
1、全局解释器锁
Python代码的执行是由Python虚拟机(又名解释器主循环)进行控制的;
在主循环中同时只能有一个控制线程在执行;
内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。
尽管Python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。
对 Python虚拟机的访问是由**全局解释器锁(GIL)**控制的。这个锁就是来保证同时只能有一个线程运行的。
当调用外部代码(即,任意C/C++扩展的内置函数)时,GIL会保持锁定,直至函数执行结束。
2、退出线程
当一个线程完成函数的执行时它就会退出。你还可以通过调用诸如thread.exit()之类的退出函数,或者sys.exit()之类的退出python进程的标准方法,亦或抛出SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。
3、在Python中使用线程
Python虽然支持多线程,但是还需要取决于它所运行的操作系统。绝大多数的类UNIX平台以及Windows平台都是支持多线程的。
Python使用兼容POSIX的线程,也就是众所周知的pthread。
4、不使用线程的情况
使用但线程执行循环:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
'''
使用单线程执行循环
'''
__author__ = 'TaoGuan'
from time import sleep, ctime
def loop0():
print('start loop 0 at:',ctime())
sleep(4)
print('loop 0 DONE at:',ctime())
def loop1():
print('start loop 1 at:',ctime())
sleep(2)
print('loop 1 DONE at:',ctime())
def main():
print('starting at:',ctime())
loop0()
loop1()
print('all DONE at:',ctime())
if __name__ == '__main__':
main()
运行结果:
starting at: Sat Sep 29 09:50:06 2018
start loop 0 at: Sat Sep 29 09:50:06 2018
loop 0 DONE at: Sat Sep 29 09:50:10 2018
start loop 1 at: Sat Sep 29 09:50:10 2018
loop 1 DONE at: Sat Sep 29 09:50:12 2018
all DONE at: Sat Sep 29 09:50:12 2018
理论上,该程序执行完成至少需要6秒,从运行结果看,符合理论预期。那么,loop0盒loop1能不能并行执行呢?答案是肯定的。
二、thread模块
1、使用thread
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
'''
使用htread模块
'''
__author__ = 'TaoGuan'
import _thread
from time import sleep, ctime
def loop0():
print('start loop 0 at:',ctime())
sleep(4)
print('loop 0 DONE at:',ctime())
def loop1():
print('start loop 1 at:',ctime())
sleep(2)
print('loop 1 DONE at:',ctime())
def main():
print('starting at:',ctime())
_thread.start_new_thread(loop0,())
_thread.start_new_thread(loop1,())
sleep(6)
print('all DONE at:',ctime())
if __name__ == '__main__':
main()
运行:
fwwdeair:4 fww$ python3 mtsleepA.py
starting at: Sat Sep 29 12:36:05 2018
start loop 0 at: Sat Sep 29 12:36: