一、多线程
- 什么是线程:程序的执行线路,相当于一条流水线,其包含了程序的具体执行步骤,如果我们把操作系统比喻为一个工厂,进程就是车间,线程就是流水线
- 线程和进程的关系:进程中包含了运行改程序需要所有资源,进程是一个资源单位,线程是CPU的最小执行单位,每一个进程一旦被创建就默认开启了一条线程,称之为主线程,一个进程可以包含多个线程,进程包含线程,而线程依赖进程。
- 为什么使用线程:是为了提高程序效率,为何不用多进程提高效率?是因为进程对操作系统的资源耗费非常高
- 线程是如何提高效率的:多线程可以使CPU在一个进程内进行切换,从而提高CPU占用率
- 如何使用:两种开启线程的方式
- 实例化Thread类
- 继承Thread类覆盖run方法
- 什么情况下应该开启多线程:
- 当程序中遇到IO的时候
- 当程序中是纯计算任务时,也无法提高效率
- 进程和线程的区别:
- 进程对于操作系统的资源耗费非常高,而线程相反非常低(比进程低10-100倍)
- 在同一个进程中,多个线程之间资源是共享的
开启线程的第一种方式:
from threading import Thread
from multiprocessing import Process
def task():
print("threading running!")
t1 = Thread(target=task)
t1.start()
print("over")
#threading running!
#over
开启线程的第二中方式:
from threading import Thread
from multiprocessing import Process
class MyThread(Thread):
def run(self):
print("子线程 running....")
MyThread().start()
print("over2")
二、线程对比进程
100个进程时间统计:
from multiprocessing import Process
import time
def task():
pass
# 100个进程时间统计
if __name__ == '__main__':
start = time.time()
ps = []
for i in range(100):
p = Process(target=task)
p.start()
ps.append(p)
for p in ps:
p.join()
print(time.time()-start) #时间为6.289931774139404
100个线程时间统计:
from threading import Thread
import time
def task():
pass
start = time.time()
ts = []
for i in range(100):
t = Thread(target=task)
t.start()
ts.append(t)
for t in ts:
t.join()
print(time.time()-start) #0.013973474502563477
三、线程间资源共享
from threading import Thread
x = 100
def task():
print('run....')
global x
x = 0
t = Thread(target=task)
t.start()
t.join()
print(x)
print('over')
#run....
#0
#over
四、守护线程
- 什么是守护线程:守护线程会在所有非守护线程结束后结束,如果把线程分为皇帝、太子、和皇后,皇后设置为守护线程,那么皇后线程会在太子和皇帝都死亡后死亡当所有非守护线程结束后,守护线程也跟着结束了。同一个进程可以有多个守护线程
from threading import Thread
import time
def task():
print('子线程运行')
time.sleep(1)
print('子线程结束')
t = Thread(target=task)
t.setDaemon(True)
t.start()
print("over")
#子线程运行
#over
五、线程中常用属性
from threading import Thread,current_thread,enumerate,active_count
import os
def task():
print('running...')
print(os.getpid()