python中进程的锁和线程的锁用法一样
- Lock锁(只能锁一个,放一个)
import multiprocessing
import time
lock = multiprocessing.Lock()
def task(args):
p = multiprocessing.current_process()
lock.acquire()
time.sleep(2)
print(p.name)
print(args)
lock.release()
def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
if __name__ == '__main__':
run()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
2.RLock锁(可以上多把锁,也是锁一个放一个)
lock = multiprocessing.RLock()
def task(args):
p = multiprocessing.current_process()
lock.acquire()
lock.acquire()
time.sleep(2)
print(p.name)
print(args)
lock.release()
lock.release()
def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
if __name__ == '__main__':
run()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- seamphore锁(可以控制进入临界区的进程数量)
lock = multiprocessing.BoundedSemaphore(3)
def task(args):
p = multiprocessing.current_process()
lock.acquire()
time.sleep(2)
print(p.name)
print(args)
lock.release()
def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
if __name__ == '__main__':
run()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- Condition锁(可以控制任意一次放出的进程的数量)
lock = multiprocessing.Condition()
def task(args):
p = multiprocessing.current_process()
lock.acquire()
lock.wait()
time.sleep(2)
print(p.name)
print(args)
lock.release()
def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
if __name__ == '__main__':
run()
while True:
num = int(input("请输入要释放的进程数量:"))
lock.acquire()
lock.notify(num)
lock.release()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- Event锁
lock = multiprocessing.Event()
def task(args):
p = multiprocessing.current_process()
lock.wait()
time.sleep(2)
print(p.name)
print(args)
def run():
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
lock.set() #使锁失效
print("锁失效的结果")
def run2():
lock.clear()#使锁再次生效
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
print("锁生效的结果")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20