多线程优点
- 更好的资源利用率
- 简单的程序设计在某些场景下。
- 更快的响应程序。
线程和进程
1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位; 2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线 3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,推等)及一些进程级的资源(如打开文件尔和信号等),某进程内的线程在其他进程不可见; 4.调度和切换:线程上下文切换比进程上下文切换要快得多
线程包含模块
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名
创建线程
方法一:通过函数来创建线程
import threading import time def test(x): print(x) time.sleep(2) t1 = threading.Thread(target=test, args=(1, )) #用t1这个变量来代表一个线程,然后写入一个target来指定目标test(记住不要加括号),如有目标参数的话就引入一个args来指定参数 t2 = threading.Thread(target=test, args=(2, )) #通过以上方法就创建完成 t1.start() t2.start() # 通过这个start函数来调用这个线程
方法二:通过类来创建多线程
# 用类来创建多线程 class Mythread(threading.Thread): def __init__(self, n): # 初始化 super(Mythread, self).__init__() self.n = n def run(self): #这个函数必须叫run print('以类的方式创建多线程', self.n) time.sleep(3) r1 = Mythread(11) r2 = Mythread(22) # 至此已经创建了多线程 r1.start() r2.start()
线程锁 相关创建
def run():
global x #设置全体变量
lock.acquire() #操作变量之前进行加锁
x += 1
lock.release() #操作变量之后进行解锁if __name__ == '__main__':
x = 0 #定义变量x
res = [] #定义列表
lock = threading.Lock() #实例化一个锁对象
for i in range(100):
t = threading.Thread(target=run) #创建多线程
t.start()
res.append(t) #写入列表
for t in res:
t.join()
print(x)