原文转载于:https://blog.csdn.net/cliviabao/article/details/80569392
python本身的设计对多线程的执行有所限制。为了数据安全设计有GIL全局解释器锁。在python中,一个线程的执行包括获取GIL、执行代码直到挂起和释放GIL。每次释放GIL锁,线程之间都会进行竞争,由拿到锁的线程进入cpu执行,所以由于GIL锁的存在,python里的一个进程永远只能同时执行一个线程。
python的多线程
python的多线程实际上只是在执行的时候看起来像是并发的。
· 使用threading模块
import threading
import datetime
import time
def dosomething(num):
print('the number is',num)
time.sleep(1)
if __name__ == '__main__':
starttime = datetime.datetime.now()
list = [1,2,3,4,5,6,7,8,9,10]
for i in list:
dosomething(i)
endtime = datetime.datetime.now()
print('time used',endtime-starttime)
在不使用threading的模块下,由单线程执行上述代码用时10秒,每次sleep的过程都是在等待,效率低。
使用threading模块,在某个线程等待的时间执行其他线程,效率提升。(不足1秒的原因是,没有加join,主线程先于其他线程执行完毕)
import threading
import datetime
import time
def dosomething(num):
print('the number is', num)
time.sleep(1)
if __name__ == '__main__':
starttime = datetime.datetime.now()
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in list:
threading.Thread(target=dosomething, args=(i,)).start()
endtime = datetime.datetime.now()
print('time used', endtime - starttime)
因此线程试用的场合之一就是非计算密集的场合,与其等待某个阻断作业的完成,不如趁着等待时间来执行其他线程。