Python ThreadPoolExecutor 中如何使用线程锁
Python ThreadPoolExecutor 中如何使用线程锁
在使用 ThreadPoolExecutor 进行多线程编程时,如果多个线程需要访问共享资源,就需要使用线程锁来保证数据一致性。
使用 threading.Lock() 添加线程锁
threading.Lock() 可以创建一个线程锁对象,使用 with lock: 语句可以保证同一时间只有一个线程可以执行代码块。
示例代码:
import threading
from concurrent.futures import ThreadPoolExecutor
# 创建线程锁
lock = threading.Lock()
def test_module(module):
# 使用 with lock: 保护代码块
with lock:
# 代码块需要线程锁保护
print(f'Testing module {module}...')
with ThreadPoolExecutor(max_workers=len(setting.test_modules)) as executor:
for module in setting.test_modules:
executor.submit(test_module, module)
代码解释:
- 首先创建了一个
threading.Lock()对象lock。 - 在需要保护的代码块前后使用
with lock:语句。 - 当一个线程进入
with lock:语句时,会尝试获取锁。如果获取成功,则该线程可以执行代码块;如果获取失败,则该线程会被阻塞,直到获取到锁为止。 - 当线程执行完代码块后,会自动释放锁,以便其他线程获取。
注意:
- 确保所有需要访问共享资源的线程都使用相同的锁对象。
- 尽量减少持有锁的时间,避免阻塞其他线程。
- 可以使用
lock.acquire()和lock.release()方法手动获取和释放锁,但这需要谨慎处理,避免出现死锁等问题。
通过使用线程锁,可以有效地保护共享资源,确保多线程程序的正确性和稳定性。
原文地址: https://www.cveoy.top/t/topic/jwaq 著作权归作者所有。请勿转载和采集!