总目录
python多线程使用的库是threading
一、导入方法:
import threading
二、使用方法:
注意,如果函数不需要穿参数,args可以省略。如果使用args,注意等号右边为一个元组,即就算只有一个元素,必须加逗号!
t = threading.Thread(target=需要多线程执行的函数名不加括号, args=(需要传入的参数,))
t.start()
三、多线程的锁定
这里使用了threading包下面的两个函数:Thread、Lock
Thread 用来实现多线程
Lock 加锁功能,用于控制对共享资源的访问。使用锁的目的是确保在任一时刻只有一个线程可以访问共享资源,这样可以避免竞争条件和其他并发问题
from threading import Thread, Lock
class SharedResource:
def __init__(self):
self.value = 0
self.lock = Lock()
def increment(self):
with self.lock:
self.value += 1
# 创建共享资源实例
resource = SharedResource()
# 创建多个线程来修改共享资源
threads = [Thread(target=resource.increment) for _ in range(10)]
# 启动所有线程
for thread in threads:
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print(resource.value) # 应该输出10,因为每个线程都增加了1
(一)加锁
lock.acquire()
是一个方法调用,用于获取一个锁。锁是一种同步机制,用于控制多线程程序中资源的访问。以下是关于lock.acquire()
的详细解释:
lock
:这是一个Lock
对象,在类的实例化过程中被创建。这个锁对象用于保护共享资源,防止多个线程同时访问该资源。如果锁已经被另一个线程锁定,那么调用
acquire()
的线程将被阻塞,直到锁被释放。也就是说,线程将暂停执行,等待锁变为可用状态。
(二)解锁
lock.release() 释放掉已经加的锁。
使用加锁、解锁的实现:
from threading import Thread, Lock
class SharedResource:
def __init__(self):
self.value = 0
self.lock = Lock()
def increment(self):
self.lock.acquire():
self.value += 1
self.lock.release()
# 创建共享资源实例
resource = SharedResource()
# 创建多个线程来修改共享资源
threads = [Thread(target=resource.increment) for _ in range(10)]
# 启动所有线程
for thread in threads:
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print(resource.value) # 应该输出10,因为每个线程都增加了1
(三)枷锁——解锁的简单且安全的执行方式
可以使用with lock的方式,替代加锁、解锁两个动作。它自动获取锁,并在代码块执行完毕后释放锁。这比直接调用acquire()
和release()
更安全,因为它即使在发生异常时也能确保锁被释放。如果你不使用with
语句,你需要手动调用acquire()
和release()
:
with lock的测试代码:
from threading import Thread, Lock
class SharedResource:
def __init__(self):
self.value = 0
self.lock = Lock()
def increment(self):
with self.lock:
self.value += 1
# 创建共享资源实例
resource = SharedResource()
# 创建多个线程来修改共享资源
threads = [Thread(target=resource.increment) for _ in range(10)]
# 启动所有线程
for thread in threads:
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print(resource.value) # 应该输出10,因为每个线程都增加了1