并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别
1.互斥锁:
互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低
保证多个进程修改一块数据时,大家是一个一个修改,不错乱
mutex.acquire()
mutex.release()
from multiprocessing import Process,Lock
import time def task(name,mutex):
mutex.acquire()
print('%s 1'%name)
time.sleep(1)
print('%s 2'%name)
time.sleep(1)
print('%s 3'%name)
mutex.release() if __name__ == "__main__":
# 这样写,子进程会copy一份,就变成了全新的锁 ,但是我们应该要让所有的进程持一把锁,
# 所以就把锁 传进去,共用一把锁
mutex = Lock()
for i in range(3):
p = Process(target=task,args=('进程%s'%i,mutex))
p.start()
"""
# 大家共享资源,错乱了,这里共享终端,打印,结果3个进程错位打印了
进程1 1
进程2 1
进程0 1
进程2 2
进程0 2
进程1 2
进程1 3
进程0 3
进程2 3
"""
"""
# 执行效率低了,但是保证了不错乱
进程0 1
进程0 2
进程0 3
进程2 1
进程2 2
进程2 3
进程1 1
进程1 2
进程1 3
"""
2.模拟抢票:
多个进程操作同一个文件时,需要上互斥锁:eg:抢票往文件里的票数-1,否则有问题,多人都抢到票,但只有一张
mutex.acquire()
mutex.release()
import json
import time
from multiprocessing import Process,Lock def search(name):
time.sleep(1)
dic = json.load(open('db.txt', 'r', encoding='utf-8'))
print('<%s> 查看剩余票数【%s】'%(name,dic['count'])) def get(name):
time.sleep(1)
dic = json.load(open('db.txt', 'r', encoding='utf-8'))
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(3)
json.dump(dic,open('db.txt','w',encoding='utf-8'))
print('<%s> 购票成功'%name) def task(name,mutex):
search(name)
mutex.acquire() # 加上互斥锁 之后,就可以只有一个人购票成功了
get(name)
mutex.release() if __name__ == "__main__":
mutex = Lock()
for i in range(10):
p = Process(target=task,args=('路人%s'%i,mutex))
p.start()
3.互斥锁与join区别:
join:是把代码整体变成了串行
互斥锁:可以把局部的代码变成串行,只对“共享数据修改”那里上锁
import json
import time
from multiprocessing import Process,Lock def search(name):
time.sleep(1)
dic = json.load(open('db.txt', 'r', encoding='utf-8'))
print('<%s> 查看剩余票数【%s】'%(name,dic['count'])) def get(name):
time.sleep(1)
dic = json.load(open('db.txt', 'r', encoding='utf-8'))
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(3)
json.dump(dic,open('db.txt','w',encoding='utf-8'))
print('<%s> 购票成功'%name) def task(name):
search(name)
# mutex.acquire() # 加上互斥锁 之后,就可以只有一个人购票成功了
get(name)
# mutex.release() if __name__ == "__main__":
mutex = Lock()
for i in range(10):
p = Process(target=task,args=('路人%s'%i,))
p.start()
p.join()
并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别的更多相关文章
- 4 并发编程-(进程)-守护进程&互斥锁
一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...
- 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)
目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...
- 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁
多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 切换+保存状态 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...
- python并发编程-进程理论-进程方法-守护进程-互斥锁-01
操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...
- python语法基础-并发编程-进程-进程锁和进程间通信
############### 守护进程 ############## """ 守护进程 父进程中将一个子进程设置为守护进程,那么这个子进程会随着主进程的结束而结束 ...
- Python(并发编程进程)
并发编程 二.多进程 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函 ...
- (并发编程)进程 (multiprocessing--Process实现进程并发)
['创建进程2方式种', '进程对象属性:join方法,守护进程obj.daemon=True,obj.pid, obj.name, obj.terminate(),obj.is_alive()等 ' ...
- python语法基础-并发编程-进程-进程理论和进程的开启
############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生 ...
- Java并发编程:进程和线程的由来(转)
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
随机推荐
- MUTT+MSMTP利用163服务器发送邮件
监控系统发送告警邮件,我们自己搭建邮件服务器,成本较高,所以可以使用163等第三方MTA帮助我们发送.MUTT+MSMTP是一个很好的选择,具体实现如下: tar -xvf msmtp-1.6.5.t ...
- 逃生dp
蒜头君在玩一款逃生的游戏.在一个 n \times mn×m的矩形地图上,蒜头位于其中一个点.地图上每个格子有加血的药剂,和掉血的火焰,药剂的药效不同,火焰的大小也不同,每个格子上有一个数字,如果格子 ...
- ar命令学习
之前,学习Linux下使用静态库的时候涉及到了这三个命令: gcc -c my_strcpy.c my_strcmp.car rcs libmylib.a *.ogcc -o main main.c ...
- keepalive脑裂的处理,从节点发现访问的虚拟IP就报警,同时尝试发送内容到主节点服务器关闭keepalive和nginx,或者关机
解决keepalived脑裂问题 检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: 1 2 3 4 5 6 7 8 9 10 ...
- linux查看端口命令和kill
1.查看 netstat -atunlp 2kill:kill -9 PID
- Yii2.0实现微信公众号后台开发
接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return [ //微信接入 'wechat' =>[ 'token' => 'your ...
- 禁止Apache显示目录索引的常见方法
禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止Apache浏览目录,这是网上提问比较多的,其实都是一个意思.下面说下禁止禁止Apache显示目录索引的常见的3种方法. 要实现禁止 ...
- Docker 使用及常用命令
https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/expose.html docker practice 资料 -- ...
- 转载 -- Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`
[cocopad集成百川sdk官网] iOS需要填写BundleID .BundleID要是当前应用的BundleID.勾选淘宝登录基础包下载SDK. 注意事项:将下载的SDK中的身份图片yw_122 ...
- Docker 如何把镜像上传到docker hub
1 首先你得准备一个hub 的帐号, 去 https://hub.docker.com 注册吧! 2 在hub那里新建一个仓库, 这个就类似于github那边的..create ---> cre ...