线程
一、线程定义:
- 进程:资源单位(起一个进程,仅仅是在内存空间中开辟一块独立的空间)
- 线程:执行单位(真正被cpu执行的是进程里面的线程,线程是指代码的执行过程,执行代码中所需要的资源都在所在的进程内索要)
- 操作系统为工厂,进程为车间(物料、辅料),线程为流水生产线(对物料或辅料进行加工)。
- 每一个进程至少带一个线程
- 进程和线程都是虚拟名称,只是为了更方便的描述问题。
二、为何要有线程:
- 开设进程:
- 申请内存空间
- 拷贝代码
- 开设线程:
开设新线程不需要开辟内存空间,
- 总结:线程的开销远远小于进程的开销;同一个线程下的数据是共享的。(相当于几条流水线在同一个车间)
三、如何使用线程:
- 开启线程的两种方式
- tcp服务端实现并发的效果
- 线程对象的join方法
- 线程间数据共享
- 线程对象属性及其它方法
- 守护线程
- 线程互斥锁
- GIL全局解释器锁
- 多进程与多线程的实际应用场景
01 开启线程的两种方式:
方式一:
from threading import Thread
from multiprocessing import Process
import time
def func(name):
print("%s is running" % name)
time.sleep(1)
print("%s is over" % name)
if __name__ == '__main__':
# t = Thread(target=func, args=("hector",))
p = Process(target=func, args=('hector',))
p.start()
# t.start()
print("main thread")
总结:对比执行进程和线程可以发现开设进程因为开辟内存空间耗时,时间更长
方式二:
from threading import Thread
import time
class Mythread(Thread):
def __init__(self, name):
super().__init__() # 重写父类的方法,这个是将父类的方法直接继承应用。
self.name = name
def run(self):
print("%s is running" % self.name)
time.sleep(1)
print("%s is over" % self.name)
if __name__ == '__main__':
t = Mythread("nico")
t.start() #没有完全理解为什么这个地方是用start(),而不是使用run().在开进程的时候也面临这样的问题。
print("main thread")

浙公网安备 33010602011771号