Python提供了多种在多进程中保证资源同步与控制的工具,其中Semaphore和互斥锁(读-写锁)是最常用的。
Semaphore 控制并发数
Semaphore(信号量)可以用来控制并发进程数,通过设置一个并发的数量(也就是信号量),后续的进程就会通过信号量来控制并发,避免进程数量过多导致系统资源不足。通过Semaphore控制同一时间只有一定数量的进程能够同时执行,这在一些场景下非常实用。
示例:
import time
import random
from multiprocessing import Semaphore, Process
s = Semaphore(3) # 控制并发量为3个
def worker(s, num):
s.acquire() # 获取信号量
print(f"线程{num}开始执行任务")
time.sleep(random.random() * 5) # 模拟任务执行
print(f"线程{num}执行任务完成")
s.release() # 释放信号量
for i in range(10):
p = Process(target=worker, args=(s, i))
p.start()
以上的代码创建了10个进程,但是我们设置的并发量为3,因此只有前三个进程可以立即获得信号量并开始执行任务。
互斥锁LOCK控制资源访问
当多个进程访问同一份资源时,为了避免在同时写入时出现冲突,需要控制资源的访问,此时互斥锁(Lock)派上了用场。Lock能够通过设施锁和释放锁来保证同一时间只有一个进程操作该资源,避免冲突。
示例:
import time
from multiprocessing import Process, Lock
def worker(lock, num, table):
with lock:
print(f"线程{num}读取表格内容:", table)
time.sleep(1)
table[num] = num + 1
print(f"线程{num}执行写入操作后表格内容:", table)
table = [0] * 5 # 表格
lock = Lock() # 互斥锁
for i in range(5):
p = Process(target=worker, args=(lock, i, table))
p.start()
以上的代码创建了5个进程,通过互斥锁保证了同时只有一个进程在操作表格。这样就避免了在修改某个元素时,其他进程同时修改造成的错误。
参考资料:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现多进程并发控制Semaphore与互斥锁LOCK - Python技术站