# 进程都默认拥有一条主线程,线程相当于流水线,进程相当于车间.
#什么是线程:程序的执行线路,相当于一条流水线,其包含了程序的具体执行步骤.
# 进程中包含了运行该程序需要的所有资源,进程是资源单位,线程是cpu的最小执行单位
# 进程包含线程而线程依赖于进程
# 进程对系统的资源消耗非常的高
# 多线程可以让cpu在一个进程内切换,从而提高cpu占用率
二 .开启多线程的两种方式 对比多进程实际是一样的方式
1.实例化Thread
2.继承Thread类 覆盖 run方法
from threading import Thread
def task():
print('threading running')
t1 = Thread(target = task,)
t1.staet()
print('over')
第二:继承
class MyThread(Thread):
def run(self):
print('子线程running')
MyThread().start()
print('over')
三:
什么情况下开启多线程
当程序中遇到IO操作的时候
当程序中是纯计算任务,即使开多线程也无法提高效率
进程和线程的区别:
1.所有的同一个进程内的线程共享这个进程中的所有数据资源
2.进程对于操作系统的资源消耗非常高,而线程比较低大概的倍数10-100倍
例子:
100个线程和100个进程开启时间的对比:
from multiprocessing import Process from threading import Thread 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) 100个线程时间 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)
线程中的一些常规使用属性
# from threading import enumerate,current_thread,active_count
# 获取所有线程对象列表 print(enumerate())
# 获取当前线程 print(current_thread())
# 获取当前正在进行的线程个数 print(active_count())
四:线程互斥锁
import time from threading import Thread,Lock lock = Lock() a =100 def task(): lock.acquire() global a temp = a - 1 time.sleep(0.01) a = temp lock.release() ts = [] for i in range(100): t = Thread(target=task) t.start() ts.append(t) 将进程对象加入列表 for t in ts : 循环列表中的进程为其添加join 让主线程等待其他子线程全部执行完后再执行 t.join() print(a)
五.信号量
其实也是一种锁,特点是可以设置一个数据被多个线程(进程共享)
对比普通锁的区别:
普通锁: 一旦加锁则意味着.这个数据只能被同时一个人使用,信号量可以在同一个时间被多个线程使用
作用可以防止数据被同时访问过载,限制访问的线程个数
from threading import Semaphore,Thread,current_thread import time,random sem = Semaphore(3) #设置同时可以多少个线程访问数据执行 def task(): sem.acquire() print('%s run.....'%current_thread()) time.sleep(3) #3个线程一批的执行 sem.release() for i in range(10): t = Thread(target=task) t.start()