Python基础之多线程
1.进程与线程
进程:一个正在执行的程序,称为一个进程
线程:进程执行的最小单位,可以保证进程的正常执行。一个进程中至少含有一个线程,该线程称为主线程
2.Python中的线程
python中使用_thread
或threading
模块对线程进程处理。其中threading
是对_thread
的再次整合,所以在Python3中建议使用threading
模块。
导入threading
模块
import threading
获取主线程
# 获取主线程
print(threading.main_thread())
# <_MainThread(MainThread, started 5748)>启动状态
创建子线程
# 线程执行的方法
def sum_num(n):
# 获取当前执行该任务的线程对象
th = threading.currentThread()
print("当前正在执行的线程名字为", th.name)
sum_re = 0
for i in range(n+1):
sum_re += n
print("求和结果:",sum_re)
# 创建子线程
# thread1 = Thread(target[绑定方法], args[参数列表(元组形式)],name[线程名称])
thread1 = Thread(target=sum_num, args=(1000000000,), name="thread1")
# 启动指定线程
thread1.start()
# setDaemon(True):如果设置为True,则是将该线程设置为主线程守护线程, 当主线程执行结束的时候,该线程不管任务是否完成都会被系统强制终止。thread1.setDaemon(True)的作用跟join的作用完全相反
thread1.setDaemon(True)
# join(timeout=time):设置主线程必须等待对应子线程的执行,等待指定的时间time之后,没如果子线程没有结果返回,主线程不再等待,继续执行。如果该时刻之内返回,主线程立刻继续执行,如果timeout设置为None(默认),此时主线程必须等待子线程运行结束才能执行
thread1.join(timeout=1)
3.锁(Lock)
当多个线程出现修改同一个公共资源的时候,为了防止多个线程同时争抢统一资源此时需要为给一个线程对应的操作执行上锁解锁任务
lock
对象中内置两个方法,分别是acquire
和release
,其中acquire()是获取锁的过程(上锁),release()
是释放锁的过程(解锁),但是注意如果程序运行过程中某一个线程在调用acquire()
上锁之后没有调用release()
解锁,此时就会出现死锁现象,此时程序会进入阻塞状态
from threading import Thread
import threading
# 创建lock对象
lock = threading.Lock()
# 定义全局变量
count = 0
# 定义函数,完成对公共资源修改操作
def change(n):
# 获取锁,并为当前线程上锁
lock.acquire()
global count
count += n
count -= n
# 为当前线程释放锁
lock.release()
# 定义函数完成对count进行n次修改
def target1(n):
for i in range(n):
change(i)
# 定义一个函数完成对count进行m次修改
def target2(m):
for i in range(m):
change(m)
# 创建两个子线程,分别完成target1任务和target2任务
thread1 = Thread(target=target1, args=(100,), name='thread1')
thread2 = Thread(t