python学习(三十二)线程锁&守护线程&多进程
Posted 所谓双鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习(三十二)线程锁&守护线程&多进程相关的知识,希望对你有一定的参考价值。
1、线程锁
如果多个线程同时要修改一个数据的时候,可能会把数据覆盖,这个时候就要在改数据的时候加锁,只同时有一个线程在改这个数据,改完后再解锁。
在Python2里面要加锁,在Python3里面不用,因为Python3里面会自动加锁和解锁。
在Python2里面加锁的代码如下:
import threading,time num=1 lock=threading.Lock() #申请一把锁 def run(): time.sleep(1) global num lock.acquire() #加锁 num+=1 lock.release() #解锁 #在python3里面可以不加,默认会加上的 ts=[] for i in range(50): t=threading.Thread(target=run) t.start() ts.append(t) [t.join() for t in ts] #如果主线程没有做等待(以上两句),那么最后打印的num值是1,因为打印num的时候,子线程因有sleep时间还没执行完 print(num)
2、守护线程
把子线程设置为守护线程,那么主线程一旦结束,子线程不管有没有执行完也会结束
import threading,time def run(): time.sleep(3) print(‘hhh‘) for i in range(50): t=threading.Thread(target=run) t.setDaemon(True) #把子线程设置成为守护线程 t.start() print(‘运行完成‘) #主线程执行完了,子线程也就结束了,所以只会打印这一句
以上代码,本来在3秒后要输出hhh,结果因为主线程运行完后,还没到3秒,hhh还没打印,子线程也结束了,所以只输出运行完成
如果以上代码主线程在输出运行完成后,等待3秒,那么子线程就可以执行
import threading,time def run(): time.sleep(3) print(‘hhh‘) for i in range(50): t=threading.Thread(target=run) t.setDaemon(True) #把子线程设置成为守护线程 t.start() print(‘运行完成‘) #主线程执行完了,子线程也就结束了,所以只会打印这一句 time.sleep(3) #因为主线程在打印上一句后,等待了3秒,这时候子线程运行完了,所以子线程的内容也会打印
3、多进程
多进程多用于处理CPU密集型任务
多线程多用于处理I/O密集型任务
import multiprocessing,threading def my(): print(‘哈哈哈哈‘) def run(num): for i in range(num): t=threading.Thread(target=my) t.start() if __name__==‘__main__‘: for i in range(5): p=multiprocessing.Process(target=run,args=(6,)) #启动进程 p.start()
启动进程,每个进程有6个线程,总共5个进程,最后输出30次哈哈哈哈
以上是关于python学习(三十二)线程锁&守护线程&多进程的主要内容,如果未能解决你的问题,请参考以下文章
并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)
Python之路(第四十二篇)线程相关的其他方法join()Thread类的start()和run()方法的区别守护线程