📅  最后修改于: 2023-12-03 14:51:21.865000             🧑  作者: Mango
在多进程或多线程的环境下,为了避免不同进程/线程之间对同一共享资源的读写冲突,需要使用同步机制来控制进程/线程的访问,保证数据一致性。
本文将介绍Python中的信号量(Semaphore)用法。
信号量是一个计数器,用来控制对共享资源的访问。它常常被用于控制进程数量,达到限制并发访问某一共享资源的目的。
Semaphore的操作有两种,分别是P操作和V操作:
举个例子:一家餐厅只有10个位子,当来到第11个客人时,就需要等待前面的客人走了才能进来。这个时候,10个位子就是信号量计数器的值,每有一个客人进入餐厅,计数器就减1,当计数器减到0时,下一个客人就需要等待。
Python中的Semaphore
类位于multiprocessing
模块中,使用方法如下:
from multiprocessing import Semaphore
# 初始化Semaphore对象,参数为计数器初始值
sem = Semaphore(10)
上述代码初始化了一个计数器初始值为10的Semaphore对象。
在Semaphore中,可以使用acquire()
方法进行P操作,release()
方法进行V操作。需要注意的是,acquire()
和release()
方法必须成对使用。
下面举一个简单的例子来说明Semaphore的使用方法:
from multiprocessing import Process, Semaphore
import time
def worker(sem, name):
sem.acquire() # 模拟进程占用共享资源
print(f"{name} enter")
time.sleep(2)
print(f"{name} exit")
sem.release()
if __name__ == '__main__':
sem = Semaphore(2) # 最多允许2个进程同时占用
p1 = Process(target=worker, args=(sem, "P1"))
p2 = Process(target=worker, args=(sem, "P2"))
p3 = Process(target=worker, args=(sem, "P3"))
p1.start()
p2.start()
p3.start()
上述代码中,初始化了一个计数器初始值为2的Semaphore对象。在worker
函数中,先通过acquire()
方法获取信号量,模拟进程占用共享资源。然后进行一些操作,最后使用release()
方法释放信号量,使得其他进程可以占用共享资源。最后通过Process
对象分别启动三个进程。
运行结果如下:
P1 enter
P2 enter
P2 exit
P1 exit
P3 enter
P3 exit
经过上述结果可以看出,程序最多同时允许两个进程进入,且P3需要等待前面两个进程都执行完后才能进入。
Semaphore是一种用于控制进程/线程访问共享资源的机制,Python提供了Semaphore类来实现该机制。Semaphore通过计数器的方式来限制进程/线程的访问,有效避免了资源竞争的问题。在使用Semaphore时,需要注意使用acquire()
和release()
方法成对使用,保证信号量计数器的正确性。