python如何实现多进程并发控制Semaphore与互斥锁LOCK
导读:本文共5021.5字符,通常情况下阅读需要17分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、了解锁应用场景举例描述: Lock 互斥锁:举例说明–有三个同事同时需要上厕所,但是只有一间厕所,将同事比作进程,多个进程并打抢占一个厕所,我们要保证顺序优先, 一个个来,那么就必须串行,先到先得,有人使用了,就锁住,结束后剩余的人继续争抢1、利用Lock来处理模拟三个同事抢占厕所frommultiprocessingimportProcessfrommu... ...
目录
(为您整理了一些要点),点击可以直达。- (4):1、 注意:
- (7):2、 lock和join比较:
- (37):2021-11-18 23:11:37 task1 输
- (38):2021-11-18 23:11:38 task1 输
- (39):2021-11-18 23:11:39 task1 输
- (40):2021-11-18 23:11:40 task2 输
- (41):2021-11-18 23:11:41 task2 输
- (42):2021-11-18 23:11:42 task2 输
- (43):2021-11-18 23:11:43 task3 输
- (44):2021-11-18 23:11:44 task3 输
- (45):2021-11-18 23:11:45 task3 输
应用场景举例描述: Lock 互斥锁:举例说明–有三个同事同时需要上厕所,但是只有一间厕所,将同事比作进程,多个进程并打抢占一个厕所,我们要保证顺序优先, 一个个来,那么就必须串行,先到先得,有人使用了,就锁住,结束后剩余的人继续争抢
模拟三个同事抢占厕所
执行结果:
# 输出结果:三个进程开始争抢互斥锁,先抢到的先执行,执行结束后,释放掉锁,剩下的继续争抢
task1 开始排泄
task1 排泄结束
task2 开始排泄
task2 排泄结束
task3 开始排泄
task3 排泄结束
1、 注意:
互斥锁在函数中,lock.acquire()上锁一次就要lock.release()解锁一次,在上锁与解锁之间写需要执行的代码。
如果连续上锁两次以上,就会出现死锁现象,代码将不继续执行下去。必须是锁一次解一次。
2、 lock和join比较:
共同点------都可以把并行变成串行,保证了执行顺序
不同点------join是人为设定了顺序,lock是让其争抢顺序,保证了公平性
上面的代码虽然起到了先进先出,一进一出的效果,但是并不完美。总所周知,我们上厕所是谁先抢到谁先上,并不是说按照代码里start()顺序执行。应该由先抢占到的进程限制性才更合理。
输出结果:
task2 开始打印
task2 打印结束
task3 开始打印
task3 打印结束
task1 开始打印
task1 打印结束
semaphore(信号量):用来控制对共享资源的访问数量,可以控制同一时刻并发的进程数
信号量: 也是一把锁,但是不保证数据安全性,同时开启多个线程,但是规定了同时并发执行的上限,后面走多少,进多少。(用于控制并发数量)
执行结果:首次并发量是3,后面先抢到锁先执行
Thread-1
Thread-2
Thread-3
Thread-4
Thread-5
Thread-6
Thread-7
Thread-8
Process finished with exit code 0
执行结果:
在执行结果输出的终端,每阻塞一次,按下回车键,可以更加清晰的看出进程的并发执行。
由下面执行结果可以看出,同一时刻,有两个进程在执行
2021-05-18 22:50:37 Process-1 抢占并获得锁,运行
2021-05-18 22:50:37 Process-2 抢占并获得锁,运行
2021-05-18 22:50:38 Process-1 运行结束,释放锁
2021-05-18 22:50:38 Process-3 抢占并获得锁,运行
2021-05-18 22:50:38 Process-2 运行结束,释放锁
2021-05-18 22:50:38 Process-4 抢占并获得锁,运行
2021-05-18 22:50:39 Process-3 运行结束,释放锁
2021-05-18 22:50:39 Process-5 抢占并获得锁,运行
2021-05-18 22:50:39 Process-4 运行结束,释放锁
2021-05-18 22:50:39 Process-6 抢占并获得锁,运行
2021-05-18 22:50:40 Process-5 运行结束,释放锁
2021-05-18 22:50:40 Process-7 抢占并获得锁,运行
2021-05-18 22:50:40 Process-6 运行结束,释放锁
2021-05-18 22:50:40 Process-8 抢占并获得锁,运行
2021-05-18 22:50:41 Process-7 运行结束,释放锁
2021-05-18 22:50:41 Process-8 运行结束,释放锁
Process finished with exit code 0
多个进程并发执行,提高资源利用率,从而提高效率,但是有时候我们需要在某一时刻只能有一个进程访问某个共享资源的话,就需要使用锁LOCK
执行结果:
2021-59-18 22:59:46 task1 输出信息
2021-59-18 22:59:46 task2 输出信息
2021-59-18 22:59:46 task3 输出信息
2021-59-18 22:59:47 task1 输出信息
2021-59-18 22:59:47 task2 输出信息
2021-59-18 22:59:47 task3 输出信息
2021-59-18 22:59:48 task1 输出信息
2021-59-18 22:59:48 task2 输出信息
2021-59-18 22:59:48 task3 输出信息
Process finished with exit code 0
有两种加锁方式:首先将 lock = multiprocessing.Lock() 生成锁对象lock
with lock: with会在执行前启动lock,在执行结束后关闭lock
lock.acquire() … lock.release() : 注意,这俩必须是一个接一个的对应关系
执行结果
2021-11-18 23:11:37 task1 输出信息
2021-11-18 23:11:38 task1 输出信息
2021-11-18 23:11:39 task1 输出信息
2021-11-18 23:11:40 task2 输出信息
2021-11-18 23:11:41 task2 输出信息
2021-11-18 23:11:42 task2 输出信息
2021-11-18 23:11:43 task3 输出信息
2021-11-18 23:11:44 task3 输出信息
2021-11-18 23:11:45 task3 输出信息
Process finished with exit code 0
python如何实现多进程并发控制Semaphore与互斥锁LOCK的详细内容,希望对您有所帮助,信息来源于网络。