前言
线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位,代码/数据/文件是共享的。
就好像看作一个进程中还有多个线程执行任务,简单点来说就是一个程序运行中有多个线程在执行。
一、初识多线程
1、函数中多线程:
# 初识多线程:threading from threading import Thread import time def func(i): time.sleep(2) print(i) if __name__ == '__main__': for i in range(5): thread=Thread(target=func,args=(i,)) thread.start()
2、类中多线程:
# 2、类中多线程 from threading import Thread import time class MyTread(Thread): def __init__(self,i): super().__init__() self.i=i def run(self): # 必须有run方法 time.sleep(1) print(self.i) for i in range(10): t=MyTread(i) t.start()
线程pid是一样的:
3、代码/数据/文件是共享的:
但变量计算中会可能会同时拿到变量导致数据不安全,但可以加锁(GIL锁)
实例:
# 3、代码/数据/文件是共享的实例 from threading import Thread import time num=10 # 定义一个全局变量 class MyTread(Thread): def __init__(self,i): super().__init__() self.i=i def run(self): # 必须有run方法 global num # global声明变量 time.sleep(1) print('线程:',self.i+num) # i+num for i in range(10): t=MyTread(i) t.start()
4、多线程与多进程效率对比,同是100个。
明显多线程更胜一筹,毋庸置疑。
# 4、多线程与多进程效率对比,同是100个。 from threading import Thread import time from multiprocessing import Process def func(i): return i+i if __name__ == '__main__': start=time.time() t_lst=[] for i in range(100): t=Thread(target=func,args=(i,)) # 多线程 t.start() t_lst.append(t) for i in t_lst:i.join() t1=time.time()-start print('多线程执行时间:',t1) start=time.time() p_lst=[] for i in range(100): p=Process(target=func,args=(i,)) # 多进程 p.start() t_lst.append(p) for i in p_lst:i.join() t2=time.time()-start print('多进程执行时间:',t2)
二、threading 其它方法
- current_thread:查看线程名字与id
- get_ident:查看线程id
- active_count:查看活跃线程数(注意要加上主线程)
- enumerate:查看线程所有项(len就得到活跃线程数)
1、threading模块其它方法:
# threading模块其它方法 import threading,time def func(i): time.sleep(0.5) print(i,threading.current_thread()) # 查看线程名字与id print(i,threading.get_ident()) # 查看线程id for i in range(5): threading.Thread(target=func,args=(i,)).start() print(threading.active_count()) # 查看活跃线程数(注意要加上主线程) print(threading.enumerate()) # 查看线程所有项 print(threading.current_thread()) # 查看线程名字与id
小结:
- 进程是最小的内存分配单位,线程是操作系统调度的最小单位
- 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程
- 开启一个线程所需要的时间要远远小于开启一个进程
- 多个线程内部有自己的数据栈,数据不共享,但代码/数据/文件是共享的
- 全局变量在多个线程之间是共享的,但会导致数据不安全,需加锁
欢迎来大家QQ交流群一起学习:482713805