并发编程---互斥锁---互斥锁与join的区别
互斥锁
互斥锁:就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的。
缺点:效率低,加锁过程复杂
优点:增加了安全性
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__':
mutex=Lock()
for i in range(3):
p = Process(target=task,args=('进程%s' %i,mutex))
p.start()
'''
打印结果:
进程0 1
进程0 2
进程0 3
进程1 1
进程1 2
进程1 3
进程2 1
进程2 2
进程2 3
'''
互斥锁
模拟抢票
from multiprocessing import Process,Lock
import json
import time 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()
'''
打印结果:
<路人0>查看剩余票数 [1]
<路人4>查看剩余票数 [1]
<路人1>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人5>查看剩余票数 [1]
<路人3>查看剩余票数 [1]
<路人8>查看剩余票数 [1]
<路人6>查看剩余票数 [1]
<路人7>查看剩余票数 [1]
<路人9>查看剩余票数 [1]
<路人0> 购票成功
'''
模拟抢票
互斥锁和join的区别
from multiprocessing import Process,Lock
import json
import time
'''
互斥锁:可以让局部代码串行
join:只能让全部代码变成串行
'''
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)
else:
print('<%s> 购票失败' %name) def task(name,mutex):
search(name) # 并发的进行
mutex.acquire()
get(name)
mutex.release() if __name__ == '__main__':
mutex=Lock()
for i in range(3):
p = Process(target=task,args=('路人%s' %i,mutex))
p.start()
p.join()
'''
join打印结果:
<路人0>查看剩余票数 [1]
<路人0> 购票成功
<路人1>查看剩余票数 [0]
<路人1> 购票失败
<路人2>查看剩余票数 [0]
<路人2> 购票失败 互斥锁的打印结果:
<路人1>查看剩余票数 [1]
<路人0>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人1> 购票成功
<路人0> 购票失败
<路人2> 购票失败
'''
并发编程---互斥锁---互斥锁与join的区别的更多相关文章
- Java并发编程实战 03互斥锁 解决原子性问题
文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和 ...
- Python并发编程-GIL全局解释器锁
Python并发编程-GIL全局解释器锁 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.GIL全局解释器锁概述 CPython 在解释器进程级别有一把锁,叫做GIL,即全局解释 ...
- 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器
1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...
- 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
1 守护进程: 主进程 创建 守护进程 辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...
- Java并发编程(05):悲观锁和乐观锁机制
本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...
- Java并发编程:synchronized和锁优化
1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...
- Python并发编程(守护进程,进程锁,进程队列)
进程的其他方法 P = Process(target=f,) P.Pid 查看进程号 查看进程的名字p.name P.is_alive() 返回一个true或者False P.terminate( ...
- Java并发编程:线程和锁的使用与解析
线程的使用 新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...
- Java并发编程(五)锁的使用(下)
显式锁 上篇讲了使用synchronized关键字来定义锁,其实Java除了使用这个关键字外还可以使用Lock接口及其实现的子类来定义锁,ReentrantLock类是Lock接口的一个实现,Reen ...
- Java并发编程(四)锁的使用(上)
锁的作用 锁是一种线程同步机制,用于实现互斥,当线程占用一个对象锁的时候,其它线程如果也想使用这个对象锁就需要排队.如果不使用对象锁,不同的线程同时操作一个变量的时候,有可能导致错误.让我们做一个测试 ...
随机推荐
- [Android Studio] Using API of OpenCV DNN
前言 一.故事背景 NDK方法人脸识别 OpenCV4Android系列: 1. OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio 2.OpenC ...
- [Stats385] Lecture 04: Convnets from Probabilistic Perspective
本篇围绕“深度渲染混合模型”展开. Lecture slices Lecture video Reading list A Probabilistic Framework for Deep Learn ...
- [Hinton] Neural Networks for Machine Learning - Basic
Link: Neural Networks for Machine Learning - 多伦多大学 Link: Hinton的CSC321课程笔记1 Link: Hinton的CSC321课程笔记2 ...
- jQuery跨域调用Web API
我曾经发表了一篇关于如何开发Web API的博客,链接地址:http://www.cnblogs.com/guwei4037/p/3603818.html.有朋友说开发是会开发了,但不知道怎么调用啊? ...
- TestLink汉化操作
实验环境版本 xampp-windows-x64-7.3.2-0-VC15-installer + testlink-1.9.19 汉化操作如下 打开testlink的配置文件F:\xampp\htd ...
- html表格的基本用法
表格的基本用法 1.<!DOCTYPE html><html><head lang="en"> <meta charset="U ...
- Missing artifact com.h2database:h2:jar:1.4.197
之前OK的项目再次打开pom上报错: 一起出现的现象: maven库中这个包和H2数据库的包每次项目右键→maven→update project都会产生.lastupdate文件.原来是以前从mav ...
- uploadify中文开发文档,解决php多图上传
图片上传好用插件有,比如 uploadify ueditor html5的各种ajax上传插件,大部分都是异步,返回只是true之类,有些时候需要上传图片需要一起上传,其实可以通过操作流程来避免这个 ...
- 队列 Queue JoinableQueue
from multiprocessing import Process, Queue def f1(q); for i in range(10): q.put(i) def f2(q): whl ...
- Python的符号、对齐和用0填充
# 用0填充 print("用0填充:{0:010.2f}".format(math.pi)) # 用1填充(事实上,你无法实现“用1填充”,因为即使实现了,那也是另外一个数字) ...