一、线程与进程的关系
默认一个进程至少一个线程
(1)区别:进程只是占内存,线程才消耗CPU;
线程在进程下行进
同一进程下不同线程间数据很易共享
二、全局解释器锁(GIL)
GIL是解释器用于同步线程的一种机制,只允许同一时间执行一个线程
常见的GIL解释器有:Cpython与Ruby MRI
三、什么是堵塞线程
在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。
如果想让主线程等待子线程结束后再运行的话,就需要用到join(),此方法是在start之后
# coding=utf-8 import threading import time def chiHuoGuo(people): print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people)) time.sleep(1) print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people)) class myThread (threading.Thread): # 继承父类threading.Thread def __init__(self, people, name): ‘‘‘重写threading.Thread初始化内容‘‘‘ threading.Thread.__init__(self) self.threadName = name self.people = people def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 ‘‘‘重写run方法‘‘‘ print("开始线程: " + self.threadName) chiHuoGuo(self.people) # 执行任务 print("结束线程: " + self.name) print("yoyo请小伙伴开始吃火锅:!!!") # 创建新线程 thread1 = myThread("xiaoming", "Thread-1") thread2 = myThread("xiaowang", "Thread-2") # 开启线程 thread1.start() thread2.start() # 阻塞主线程,等子线程结束 thread1.join() thread2.join() time.sleep(0.1) print("退出主线程:吃火锅结束,结账走人")
四、非守护与守护线程
主线程中,创建了子线程 线程A和线程B,并且在主线程中调用了thread.setDaemon(),这个的意思是,把主线程设置为守护线程,这时候,要是主线程执行结束了,就不管子线程是否完成,一并和主线程退出.
线程有一个布尔属性叫做daemon。表示线程是否是守护线程,默认取否。当程序中的线程全部是守护线程时,程序才会退出。只要还存在一个非守护线程,程序就不会退出。
主线程是非守护线程。
五、普通锁与递归锁
普通锁
递归锁
六、实现线程池
原文:https://www.cnblogs.com/Eliphaz/p/13953400.html