关于多线程常用方法以及对锁的控制(详解)
什么是多线程?
多线程是指在同一时间内执行多个线程,每个线程都可以独立地执行不同的任务。相比单线程,在多线程的情况下,程序的效率和执行速度会大大提高。
常用的多线程方法
1. 创建线程
Python中可以使用threading
模块来创建线程。
import threading
def func():
print("Thread started.")
thread = threading.Thread(target=func)
thread.start()
print("Thread finished.")
通过threading.Thread()
方法创建一个新的线程,在target
参数中指定线程要执行的函数,在start()
方法中启动线程。
2. 等待线程结束
有时我们需要等待一个线程执行完成后再执行下一个线程,可以使用join()
方法。
import threading
import time
def func():
print("Thread started.")
time.sleep(2)
print("Thread finished.")
threads = []
for i in range(3):
thread = threading.Thread(target=func)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print("All threads finished.")
在此示例中,我们启动了3个线程,使用join()
方法等待所有线程执行完毕后再输出All threads finished.
。
对锁的控制
在多线程程序中,若多个线程同时访问同一内存资源,就会产生竞争,这时需要使用锁来保证数据的安全性。
1. 创建锁
Python中可以使用threading
模块的Lock()
方法来创建锁。
import threading
lock = threading.Lock()
2. 获取锁和释放锁
在需要保证资源安全的代码块前获取锁,在代码块执行完毕后释放锁。
import threading
lock = threading.Lock()
def func():
with lock:
print("Thread started.")
# 代码块
print("Thread finished.")
thread = threading.Thread(target=func)
thread.start()
在此示例中,我们使用with lock:
语句来获取锁,并在代码块执行完毕后自动释放锁。
3. 死锁
死锁是指两个或多个线程都在等待对方释放锁后才能继续执行,造成程序无限等待的情况。为避免死锁的发生,在使用锁时要注意锁的释放。
import threading
lock1 = threading.Lock()
lock2 = threading.Lock()
def func1():
with lock1:
print("Thread 1 acquired lock1.")
with lock2:
print("Thread 1 acquired lock2.")
print("Thread 1 released lock2.")
print("Thread 1 released lock1.")
def func2():
with lock2:
print("Thread 2 acquired lock2.")
with lock1:
print("Thread 2 acquired lock1.")
print("Thread 2 released lock1.")
print("Thread 2 released lock2.")
thread1 = threading.Thread(target=func1)
thread2 = threading.Thread(target=func2)
thread1.start()
thread2.start()
在此示例中,我们创建了2个锁,并分别在2个线程中获取锁。由于线程1获取锁1后又需要等待锁2的释放,而线程2获取锁2后又需要等待锁1的释放,因此会产生死锁。为避免死锁,应该尽量避免获取多个锁,或按照相同的顺序获取锁来避免死锁的发生。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于多线程常用方法以及对锁的控制(详解) - Python技术站