- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python实现多进程并发控制Semaphore与互斥锁LOCK由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
应用场景举例描述: Lock 互斥锁:举例说明–有三个同事同时需要上厕所,但是只有一间厕所,将同事比作进程,多个进程并打抢占一个厕所,我们要保证顺序优先, 一个个来,那么就必须串行,先到先得,有人使用了,就锁住,结束后剩余的人继续争抢 。
模拟三个同事抢占厕所 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
from
multiprocessing
import
Process
from
multiprocessing
import
Lock
import
time
import
random
def
task1(p, lock):
# 上锁
lock.acquire()
print
(f
'{p} 开始排泄'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 排泄结束'
)
# 解锁
lock.release()
def
task2(p, lock):
lock.acquire()
print
(f
'{p} 开始排泄'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 排泄结束'
)
lock.release()
def
task3(p, lock):
lock.acquire()
print
(f
'{p} 开始排泄'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 排泄结束'
)
lock.release()
if
__name__
=
=
'__main__'
:
# 实例化一个锁对象
mutex
=
Lock()
# 将锁以参数的形式传入进程对象
p1
=
Process(target
=
task1, args
=
(
'task1'
, mutex,))
p2
=
Process(target
=
task2, args
=
(
'task2'
, mutex,))
p3
=
Process(target
=
task3, args
=
(
'task3'
, mutex,))
p1.start()
p2.start()
p3.start()
|
执行结果:
# 输出结果:三个进程开始争抢互斥锁,先抢到的先执行,执行结束后,释放掉锁,剩下的继续争抢 task1 开始排泄 task1 排泄结束 task2 开始排泄 task2 排泄结束 task3 开始排泄 task3 排泄结束 。
1、 注意:
2、 lock和join比较:
上面的代码虽然起到了先进先出,一进一出的效果,但是并不完美。总所周知,我们上厕所是谁先抢到谁先上,并不是说按照代码里start()顺序执行。应该由先抢占到的进程限制性才更合理.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
from
multiprocessing
import
Process
from
multiprocessing
import
Lock
import
time
import
random
import
sys
def
task1(p, lock):
# 上锁
lock.acquire()
print
(f
'{p} 开始打印'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 打印结束'
)
# 解锁
lock.release()
def
task2(p, lock):
lock.acquire()
print
(f
'{p} 开始打印'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 打印结束'
)
lock.release()
def
task3(p, lock):
lock.acquire()
print
(f
'{p} 开始打印'
)
time.sleep(random.randint(
1
,
3
))
print
(f
'{p} 打印结束'
)
lock.release()
if
__name__
=
=
'__main__'
:
slock
=
Lock()
for
i
in
range
(
1
,
4
):
p
=
Process(target
=
getattr
(sys.modules[__name__], f
'task{i}'
), args
=
(f
'task{i}'
, slock))
p.start()
|
输出结果:
task2 开始打印 task2 打印结束 task3 开始打印 task3 打印结束 task1 开始打印 task1 打印结束 。
semaphore(信号量):用来控制对共享资源的访问数量,可以控制同一时刻并发的进程数 信号量: 也是一把锁,但是不保证数据安全性,同时开启多个线程,但是规定了同时并发执行的上限,后面走多少,进多少。(用于控制并发数量) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 举例说明:一间厕所有5个坑位,最多只能同时有5个人上厕所,当前时刻有20个人想上厕所,但是只能让5个人进去,然后出来多少个,才能进去多少个上厕所
# 从一个模块引用多个功能的时候,用逗号隔开
from
threading
import
Semaphore, Thread, currentThread
import
time
import
random
sem
=
Semaphore(
3
)
# 并发执行数设置为5
def
task():
sem.acquire()
print
(f
'{currentThread().name}'
)
time.sleep(random.randint(
1
,
3
))
sem.release()
if
__name__
=
=
'__main__'
:
for
i
in
range
(
20
):
t
=
Thread(target
=
task)
t.start()
|
执行结果:首次并发量是3,后面先抢到锁先执行 。
Thread-1 Thread-2 Thread-3 。
Thread-4 Thread-5 。
Thread-6 Thread-7 。
Thread-8 。
Process finished with exit code 0 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import
multiprocessing
import
time
def
worker(s, i):
s.acquire()
print
(time.strftime(
'%Y-%m-%d %H:%M:%S'
), multiprocessing.current_process().name
+
" 抢占并获得锁,运行"
)
time.sleep(i)
print
(time.strftime(
'%Y-%m-%d %H:%M:%S'
), multiprocessing.current_process().name
+
" 运行结束,释放锁"
)
s.release()
if
__name__
=
=
'__main__'
:
s
=
multiprocessing.Semaphore(
2
)
for
i
in
range
(
8
):
p
=
multiprocessing.Process(target
=
worker, args
=
(s,
1
))
p.start()
|
执行结果:
在执行结果输出的终端,每阻塞一次,按下回车键,可以更加清晰的看出进程的并发执行。 由下面执行结果可以看出,同一时刻,有两个进程在执行 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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import
multiprocessing
import
time
def
task1():
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task1 输出信息'
)
time.sleep(
1
)
n
-
=
1
def
task2():
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task2 输出信息'
)
time.sleep(
1
)
n
-
=
1
def
task3():
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task3 输出信息'
)
time.sleep(
1
)
n
-
=
1
if
__name__
=
=
'__main__'
:
p1
=
multiprocessing.Process(target
=
task1)
p2
=
multiprocessing.Process(target
=
task2)
p3
=
multiprocessing.Process(target
=
task3)
p1.start()
p2.start()
p3.start()
|
执行结果:
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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import
multiprocessing
import
time
def
task1(lock):
with lock:
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task1 输出信息'
)
time.sleep(
1
)
n
-
=
1
def
task2(lock):
lock.acquire()
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task2 输出信息'
)
time.sleep(
1
)
n
-
=
1
lock.release()
def
task3(lock):
lock.acquire()
n
=
4
while
n >
1
:
print
(f
'{time.strftime("%Y-%M-%d %H:%M:%S")} task3 输出信息'
)
time.sleep(
1
)
n
-
=
1
lock.release()
if
__name__
=
=
'__main__'
:
lock
=
multiprocessing.Lock()
p1
=
multiprocessing.Process(target
=
task1, args
=
(lock,))
p2
=
multiprocessing.Process(target
=
task2, args
=
(lock,))
p3
=
multiprocessing.Process(target
=
task3, args
=
(lock,))
p1.start()
p2.start()
p3.start()
|
执行结果 。
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的文章就介绍到这了,更多相关python 多进程Semaphore与LOCK内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/CN_LiTianpeng/article/details/117002500 。
最后此篇关于python实现多进程并发控制Semaphore与互斥锁LOCK的文章就讲到这里了,如果你想了解更多关于python实现多进程并发控制Semaphore与互斥锁LOCK的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在多线程环境中实现某种累积逻辑;我想知道没有 lock 和 synchronized 关键字是否有更好/更快的方法来做到这一点?以下是我当前的代码: public class Concurr
我需要帮助构建一个实现信号量的监视器,简单的 C 示例就可以。 这是为了证明可以在任何可以使用信号量的地方使用监视器。 最佳答案 如果您说允许使用互斥锁/condvars,请检查: #include
我已经构建了一些返回部分产品目录的 ajax,并且我正在尝试将 xml 输出到文档中,到目前为止,这是我所拥有的: $("#catalog").append("Item NamePriceDe
很抱歉,如果我的问题之前已经被问过,或者它太明显了,但我真的需要澄清这一点。感谢您的帮助。 在多用户界面中,如果来自不同用户的相同事务同时到达服务器,会发生什么? 我有下一张表: create tab
这可能是一个愚蠢的问题,但是这个程序的输出(它的方式)可以为零吗? public class Test2{ int a = 0; AtomicInteger b = new Atomi
假设我本地主机上的一个网站处理每个请求大约需要 3 秒。这很好,正如预期的那样(因为它在幕后进行了一些奇特的网络)。 但是,如果我在选项卡(在 firefox 中)中打开相同的 url,然后同时重新加
我对 MongoDB 的读锁定有点困惑。单个集合可以支持多少个并发读取操作? 最佳答案 如 tk 给出的链接中所写:http://www.mongodb.org/pages/viewpage.acti
如果有四个并发的 CUDA 应用程序在一个 GPU 中竞争资源会发生什么这样他们就可以将工作卸载到图形卡上了? Cuda Programming Guide 3.1 提到那里 某些方法是异步的: 内核
👊上次的百度面试遇到了关于spark的并发数的问题,今天我们就来将这些问题都一并解决一下,图画的的有点丑,还行大家见谅,百度实习的问题我放在了下面的链接👇: 链接: 2022百度大数据开发工程师实
我对 Groovy 线程有疑问。 我的任务是以某种方式翻译给定目录中的每个文件 并将生成的输出放在其他目录中的文件中。 我编写了以下代码,该代码有效: static def translateDir(
Java中的同步和锁定有什么区别? 最佳答案 synchronized是语言关键字;锁是对象。 当一个方法或代码块被标记为同步时,您是说该方法或代码块必须先获得某个锁对象(可以在同步的语法中指定)才能
我需要创建一个能够同时处理来自客户端的多个请求的并发 RPC 服务器。 使用 rpcgen linux编译器(基于sun RPC),不支持-A为并发服务器创建 stub 的选项。 (-A 选项在 so
System.out.println("Enter the number of what you would like to do"); System.out.println("1 = Manuall
我正在将我的应用程序移植到 iOS 8.0 并注意到 UIAlertView 已被弃用。 所以我改变了使用 UIAlertController 的方法。这在大多数情况下都有效。 除了,当我的应用程序打
我正在逐行同时读取两个文本文件。 我特别想做的是当lineCount在每个线程上都是相同的我想看看扫描仪当前正在读取的字符串。 我环顾四周寻找可以实现的某些模式,例如 Compare and Swap
我正在阅读 Java Concurrency in Practice .在章节中断政策部分 取消和关闭 它提到 A task should not assume anything about the
我正在尝试学习线程,互斥等的基础知识。遵循here的文档和示例。在下面的代码中,我得到预期的输出。问题: 想确认我是否有任何陷阱?我们如何改善下面的代码? 我的线程在哪一行尝试获取互斥锁或正在等待互斥
并发是指两个任务在不同的线程上并行运行。但是,异步方法并行运行,但在同一个线程上。这是如何实现的?另外,并行性怎么样? 这三个概念有什么区别? 最佳答案 并发和并行实际上与您正确推测的原理相同,两者都
以此ConcurrentDouble类定义为例: public class ConcurrentDouble { public double num = 0; public void subt
在得知并发确实增加了许多人的吞吐量后,我一直计划在项目中使用并发。现在我在多线程或并发方面还没有做太多工作,因此决定在实际项目中使用它之前学习并进行简单的概念验证。 以下是我尝试过的两个示例: 1.
我是一名优秀的程序员,十分优秀!