- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 Linux 的新手,并且继承了保持我们的单一 Linux 服务器运行的职责。这是我们的SVN服务器,所以比较重要。 原来在我之前维护它的人有一个 cron 任务,当有太多 svnserve 进程
Node 虽然自身存在多个线程,但是运行在 v8 上的 JavaScript 是单线程的。Node 的 child_process 模块用于创建子进程,我们可以通过子进程充分利用 CPU。范例:
Jenkins 有这么多进程处于事件状态是否正常? 我检查了我的设置,我只配置了 2 个“执行者”... htop http://d.pr/i/RZzG+ 最佳答案 您不仅要限制 Master 中的执
我正在尝试在 scala 中运行这样的 bash 命令: cat "example file.txt" | grep abc Scala 有一个特殊的流程管道语法,所以这是我的第一个方法: val f
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要一些帮助来理解并发编程的基础知识。事实上,我读得越多,就越感到困惑。因此,我理解进程是顺序执行的程序的一个实例,并且它可以由一个或多个线程组成。在单核CPU中,一次只能执行一个线程,而在多核CP
我的问题是在上一次集成测试后服务器进程没有关闭。 在integration.rs中,我有: lazy_static! { static ref SERVER: Arc> = {
我正在使用 Scala scala.sys.process图书馆。 我知道我可以用 ! 捕获退出代码和输出 !!但是如果我想同时捕获两者呢? 我看过这个答案 https://stackoverflow
我正在开发一个C++类(MyClass.cpp),将其编译为动态共享库(MyClass.so)。 同一台Linux计算机上运行的两个不同应用程序将使用此共享库。 它们是两个不同的应用程序。它不是多线程
我在我的 C 程序中使用 recvfrom() 从多个客户端接收 UDP 数据包,这些客户端可以使用自定义用户名登录。一旦他们登录,我希望他们的用户名与唯一的客户端进程配对,这样服务器就可以通过数据包
如何更改程序,以便函数 function_delayed_1 和 function_delayed_2 仅同时执行一次: int main(int argc, char *argv[]) {
考虑这两个程序: //in #define MAX 50 int main(int argc, char* argv[]) { int *count; int fd=shm
请告诉我如何一次打开三个终端,这样我的项目就可以轻松执行,而不必打开三个终端三次然后运行三个exe文件。请问我们如何通过脚本来做到这一点,即打开三个终端并执行三个 exe 文件。 最佳答案 在后台运行
我编写了一个监控服务来跟踪一组进程,并在服务行为异常、内存使用率高、超出 CPU 运行时间等时发出通知。 这在我的本地计算机上运行良好,但我需要它指向远程机器并获取这些机器上的进程信息。 我的方法,在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
我有一个允许用户上传文件的应用程序。上传完成后,必须在服务器上完成许多处理步骤(解压、存储、验证等...),因此稍后会在一切完成后通过电子邮件通知用户。 我见过很多示例,其中 System.Compo
这个问题对很多人来说可能听起来很愚蠢,但我想对这个话题有一个清晰的理解。例如:当我们在 linux(ubuntu, x86) 上构建一个 C 程序时,它会在成功编译和链接过程后生成 a.out。 a.
ps -eaf | grep java 命令在这里不是识别进程是否是 java 进程的解决方案,因为执行此命令后我的许多 java 进程未在输出中列出。 最佳答案 简答(希望有人写一个更全面的): 获
我有几个与内核态和用户态的 Windows 进程相关的问题。 如果我有一个 hello world 应用程序和一个暴露新系统调用 foo() 的 hello world 驱动程序,我很好奇在内核模式下
我找不到很多关于 Windows 中不受信任的完整性级别的信息,对此有一些疑问: 是否有不受信任的完整性级别进程可以创建命名对象的地方? (互斥锁、事件等) 不受信任的完整性级别进程是否应该能够打开一
我是一名优秀的程序员,十分优秀!