1、什么是多线程?
多线程是加速程序计算的有效形式。
2、添加线程thread
import threading # 导入模块
1)、几个基本函数
获取已经激活的线程数:print(threading.active_count())
查看所有线程信息:print(threading.enumerate())
查看现在正在运行的线程:print(threading.current_thread())
2)、添加线程
import threading
def thread_job():
print('this is an added thread ,number is %s !'%threading.current_thread())
def main():
added_thread=threading.Thread(target=thread_job) # 定义线程
added_thread.start() # 让线程开始工作
if __name__=='__main__':
main()
3、join 功能
使用join功能对控制多个线程的执行顺序非常关键。
一般为了规避不必要的麻烦,推荐下面这种1221v型排布:
added_thread1.start()
added_thread1.start()
added_thread2.start()
added_thread2.join()
added_thread1.join()
print('all done!')
结果为:
'''
T1 start
T2 start
T2 finish
T1 finish
all done
'''
4、储存进程结果Queue—非常重要
多线程调用的函数不能用return返回值,所以要用到队列Queue,将值用队列形式提取出来。这里感觉都很重要,自己也不知到该写什么啦,建议还是亲自看一下莫烦python的视频学习一下吧!
关键代码:
q=Queue()
q.put(l)
q.get()
代码附上:
def job(l,q): # l为一个列表,q为一个队列
for i in range(len(l)):
l[i]=l[i]**2
q.put(l) # 多线程调用的函数不能用return返回值
def multithreading():
q=Queue() # q中存放返回值,代替return的返回值
threads=[]
data=[[1,1,1],[2,2,2],[3,3,3],[4,4,4]]
for i in range(4): # 定义4个线程
t=threading.Thread(target=job,args=(data[i],q))
t.start()
threads.append(t) # 把每个线程append到线程列表中
for thread in threads:
thread.join()
results=[]
for _ in range(4):
results.append(q.get())
print(results)
if __name__=='__main__':
multithreading()
5、GIL不一定有效率
python完全支持多线程编程,但是解释器被一个全局解释器锁(GIL)保护着.它使得在任何时候都只有一个Python线程执行.GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势.
从运行的结果可以看出,正常计算所花费的时间不一定就是多线程花费时间的4倍,这就是中间有GIL在中间捣鼓.
6、线程锁Lock()
在不同线程使用同一共享内存时,为了确保线程之间互不影响,便采用lock的方法,确保当前线程在执行的时候,内存不会被其他线程访问.
使用方法:
首先先导入线程锁:lock=threading.Lock()
在每个线程执行运算修改共享内存之前,将共享内存上锁:lock.acquire()
执行运算结束之后,将锁打开:lock.releas()
总结
到此,莫烦Python的多线程内容就讲解结束了!
感谢大家的观看!