Python的theading库是一个方便的多线程库。它提供了一个线程类`Thread`,一个锁类`Lock`和一个信号量类`Semaphore`等等,可以用来实现多线程编程。
线程类`Thread`:
线程类Thread提供的方法:
- `Thread(target=None, args=(), kwargs={})`:
创建一个实例并返回,参数`target`是要执行的函数名,`args`和`kwargs`是该函数所需的参数。
- `start()`:
启动线程,调用该方法后,线程便开始运行。
- `join(timeout=None)`:
等待线程执行完毕,调用该方法后,主线程会等待该子线程执行完毕后再继续执行,timeout是超时时间。
- `is_alive()`:
判断线程是否在运行。
线程类Thread的使用方法:
假设有一个函数`func`,需要在多个线程同时执行该函数。
import threading
def func(arg1, arg2):
# 该函数的具体逻辑
pass
t1 = threading.Thread(target=func, args=(arg1, arg2))
t2 = threading.Thread(target=func, args=(arg3, arg4))
t3 = threading.Thread(target=func, args=(arg5, arg6))
t1.start() # 启动线程
t2.start()
t3.start()
t1.join() # 主线程等待t1线程执行完毕
t2.join()
t3.join()
锁类`Lock`:
锁类Lock提供的方法:
- `acquire(blocking=True, timeout=-1)`:
获得锁,如果锁已被其他线程占用,则阻塞等待。参数`blocking`表示是否阻塞,默认为True,即阻塞等待。参数`timeout`表示阻塞等待的时间,单位为秒,如果超时则返回False。
- `release()`:
释放锁,将锁标记为可用状态。
锁类Lock的使用方法:
当多个线程同时执行时,可能会出现资源竞争的情况,此时可以使用锁来实现资源的互斥访问。
import threading
lock = threading.Lock()
def func():
lock.acquire() # 获得锁
# 执行一些需要互斥访问的操作
lock.release() # 释放锁
信号量类`Semaphore`:
信号量类Semaphore提供的方法:
- `Semaphore(value=1)`:创建一个实例并返回,参数value表示信号量的初始值,即可同时允许的线程数。
- `acquire(blocking=True, timeout=None)`:获得信号量。当信号量的值不为0时,线程可以获得信号量,并将信号量的值减1。当信号量的值为0时,线程会阻塞等待,直到有其他线程释放信号量。
- `release()`:释放信号量。将信号量的值加1,释放资源。
信号量类Semaphore的使用方法:
当需要限制同时执行某段代码的线程数时,可以使用信号量类Semaphore来实现
import threading
semaphore = threading.Semaphore(2) # 同时只允许2个线程执行
def func():
semaphore.acquire() # 获得信号量
# 执行需要限制并发的操作
semaphore.release() # 释放信号量