1.首先了解几个概念
(1)并发:多个任务同时进行,但是同一时刻只能处理一个任务,只有一个处理器,是逻辑意义上的同时发生
(2)并行:多个任务同时进行,而且在同一时刻是同时在执行的,有多个处理器,是物理意义上的同时发生
(3)进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位
(4)线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位
(5)一个进程至少包括一个线程
2.线程的创建与调用
# -*-coding:utf-8 -*-
import threading
import time
start_time = time.time()
def foo(name):
start = time.time()
print("hello %s" % name)
time.sleep(2)
end = time.time()
cost_time = end - start
print(cost_time)
# 创建线程
# target参数指向要执行的函数名
# args参数指向要执行的函数的参数,元组或者列表都可以
threading1 = threading.Thread(target=foo, args=("小明",))
threading2 = threading.Thread(target=foo, args=("小红",))
# 启动线程
threading1.start()
threading2.start()
# 堵塞主线程:线程.join(),直到当前线程运行结束才会继续运行主线程
# threading1运行完才会继续执行主线程
threading1.join()
# threading1运行完才会继续执行主线程
threading2.join()
end_time = time.time()
print("total time:", end_time - start_time)
3.守护线程
(1)通过t1.setDaemon(True) 设置线程t1为守护线程
(2)守护线程在主线程结束之后会随之结束,不会再继续执行
(3)守护线程需要在线程启动之前设置
# -*-coding:utf-8 -*-
"""
守护线程:主线程结束,子线程也跟着结束
"""
import threading
import time
def foo():
while True:
print("生产了一个数据")
time.sleep(1)
t1 = threading.Thread(target=foo)
# 守护线程必须在启动之前设置
# 主线程结束,t1跟着结束
t1.setDaemon(True)
t1.start()
print("主线程结束。。。。。")
4.同步锁
(1)创建同步锁:lock=threading.Lock()
(2)同步锁上锁和解锁必须成对出现,否则会出现问题
(3)上锁:lock.acquire(),重要数据操作之前上锁
(4)解锁:lock.release(),重要数据操作之后解锁
5.死锁
线程死锁:多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
处理方式:
(1)递归锁:不同任务之间的线程用递归锁
lock_R = threading.RLock()
# 递归锁内部维护着一个计算器
# 每次上锁,计数器+1
# 每次解锁,计算器-1
# 计数器必须>=0
(2)同步锁:同一个任务之间的线程用同步锁