对于多线程的处理与异常处理
1、进程和线程的概念
线程: 线程(Thread)是操作系统能够进行运算的最小单位,它被包含在进程之中,是进程中的实际运作单位。
进程: 进程拥有独立的系统资源,该进程下的所有线程共享所拥有的全部资源,线程之间可以并发执行。Python默认为单线程运行。
普通函数和多线程启动的区别:
# 普通函数
def display( count ):
for i in range(1, count + 1):
print(i, end="")
time.sleep(1)
print("运行结果:") # 123451234512345
for i in range(3):
display(5)
# 多线程启动
import time
import threading
def display( count ):
for i in range( 1, count + 1 ):
print( i, end="" )
time.sleep( 1 )
for i in range( 3 ):
s = threading.Thread( target=display, args=(5,) )
s.start()
# 111222333444555
- 使用多线程我们需要导入 threading 包
- 把它封装在一个类里面,实例化对象进行调用
2、主线程和子线程
主线程: 当一个程序启动时,就有一个进程被系统创建,与此同时一个线程也会被运行,该线程通常叫做程序主线程,也就是说,程序启动就会创建一个主线程。
作用为:1、产生其他子线程的线程;2、最后完成执行。
子线程: 程序执行的一条分支,当子线程启动后会和主线程一起同时执行。
线程的阻塞:
def display1():
for i in range(1, 6):
# 把主线程的名字设置为:主线程
threading.current_thread().name = "主线程"
# 打印当前线程的名称和i的值
print(f"{threading.current_thread().name}--{i}")
time.sleep(1)
# 创建一个名为“子线程”的新线程t1
t1 = threading.Thread(target=display2, name="子线程")
# 启动t1线程
t1.start()
t1.join() # t1优先执行,会把多线程变为单线程,影响整体性能。
def display2():
for i in range(1, 6):
# 打印当前线程的名称和i的值
print(f"{threading.current_thread().name}--{i}")
time.sleep(1)
# 调用display函数
display1()
并发:
任务数多余CPU核心数,通过操作系统的任务调度算法,实现多个任务“一起”执行。(切换任务速度非常快)
并行: 任务数小于等于CPU核心数,让任务一起执行。
3、线程同步(就是在线程触发的时候给上一把锁)
线程同步:
import threading
from threading import *
threadLock = threading.Lock() # 创建一把锁
class MyThread (Thread):
def run(self):
print ("开启线程: ", threading.current_thread().name)
# 获取锁,用于线程同步
threadLock.acquire()
for i in range(5):
print(threading.current_thread().name)
# 释放锁,开启下一个线程
threadLock.release()
# 创建新线程,开启
t1 = MyThread()
t2 = MyThread()
t1.start()
t2.start()
4、对于异常的常用处理
异常:
代码示例
try:
10 * (1 / 0)
except ZeroDivisionError as error:
print(error)
else:
print('没有异常时,执行的代码。')
finally:
print('这句话,无论异常是否发生都会执行。')