例1:

10个人去买票,先去查询余票,有票就去购买。代码如下:

# ticket.py
{"ticket": 1} # 只有一张票
import json
import time
from multiprocessing import Process
from multiprocessing import Lock def show(i): # 查询票
with open('ticket') as f: # 读取文件
dic = json.load(f)
print('余票:%s'%dic['ticket']) # 余票,所以人都能查到票 def buy_ticket(i): # 买票,这个代买只有一张票,但是所有人都能买,但是打印发现好几个人买到票了,几个人没买到票。这不符合需求,因为在一个进程买票后,去修改票数时,由于时间太快,没来得及修改,就回到是其他进程买到票。
with open('ticket') as f: # 读票数
dic = json.load(f)
time.sleep(0.1)
if dic['ticket'] > 0: # 判断条件
dic['ticket'] -= 1 # 票数减1
print('%s号买到票了'%i)
else:
print('%s号没买到票'%i)
time.sleep(0.1)
with open('ticket', 'w') as f: # 将减1后的票数写入到文件
json.dump(dic, f) if __name__ == '__main__':
for i in range(10): # 生成10个进程
p = Process(target=show, args=(i,)) # 查询票
p.start()
lock = Lock()
for i in range(10):
p = Process(target=buy_ticket, args=(i,)) # 买票
p.start()

解决办法:加锁

好比一个上锁的房间,门口只有一个钥匙,一个线程拿到钥匙进去修改数据没出来前,其他进程只能等着。

import json
import time
from multiprocessing import Process
from multiprocessing import Lock # 加锁 def show(i):
with open('ticket') as f:
dic = json.load(f)
print('余票:%s'%dic['ticket']) def buy_ticket(i, lock): # 接收锁
lock.acquire() # 拿钥匙进门
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1)
if dic['ticket'] > 0:
dic['ticket'] -= 1
print('%s号买到票了'%i)
else:
print('%s号没买到票'%i)
time.sleep(0.1)
with open('ticket', 'w') as f:
json.dump(dic, f)
lock.release() # 还钥匙 if __name__ == '__main__':
for i in range(10):
p = Process(target=show, args=(i,))
p.start()
lock = Lock() # 实例化
for i in range(10):
p = Process(target=buy_ticket, args=(i,lock)) # 传入锁
p.start()

这样会出现有几张票就只有几个人能买票了,数据就安全了。

进程锁Lock的更多相关文章

  1. pythonl练习笔记——threading创建进程锁Lock()

    1 基本概述 采用threading.Lock()对象创建锁lock,即 lock = threading.Lock() 其相关方法主要有 lock.acquire() # lock the lock ...

  2. 13.1、多进程:进程锁Lock、信号量、事件

    进程锁: 为什么要有进程锁:假如现在有一台打印机,qq要使用打印机,word文档也要使用打印机,如果没有使用进程锁,可能会导致一些问题,比如QQ的任务打印到一半,Word插进来,于是打印出来的结果是各 ...

  3. 进程锁 Lock

    进程锁其实是锁的输入终端,屏幕,太多的进程,为了防止打印错乱而锁,作用不大 from multiprocessing import Process, Lock def f(l, i): l.acqui ...

  4. python从入门到放弃之进程锁lock

    # ### lock (互斥锁)"""# 应用在多进程当中# 互斥锁lock : 互斥锁是进程间的get_ticket互相排斥进程之间,谁先抢占到资源,谁就先上锁,等到解 ...

  5. 多进程操作-进程锁multiprocess.Lock的使用

    多进程操作-进程锁multiprocess.Lock的使用 ​ 通过之前的Process模块的学习,我们实现了并发编程,虽然更加充分地利用了IO资源,但是也有缺陷:当多个进程共用一份数据资源的时候,就 ...

  6. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...

  7. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  8. PHP进程锁

    <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacc ...

  9. 并发 --- 2 进程的方法,进程锁 守护进程 数据共享 进程队列, joinablequeue模型

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

随机推荐

  1. JDBC(14)—对DAO进行改进修改

    结构: DAO2_7< T >(接口)->DAOTestImpl< T >(实现类)->CustomerDAO(继承的子类)->CustomerDAOTest ...

  2. How to do conditional auto-wiring in Spring?

    ou can implement simple factory bean to do the conditional wiring. Such factory bean can contain com ...

  3. Asp.Net Core 404处理

    在使用Asp.Net Core Mvc时 404处理整理如下 一.自带404状态处理 1.控制器视图子弹404视图 NotFoundResult,NotFoundObjectResult // // ...

  4. 使用log4net生成日志文件

    (一)使用log4net生成日志文件   1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编 ...

  5. JavaScript中Object值合并方法

    原文:https://www.cnblogs.com/fullstack-yang/p/8085206.html ------------------------------------ 前言:在日常 ...

  6. requirejs amd module load example

    person.js /** * This example make use of requireJS to provide a clean and simple way to split JavaSc ...

  7. MySQL 的 autocommit

    在自动提交模式(autocommit=ON)下提交事务: •在自动提交模式下,每个SQL语句都是一个独立的事务. –mysql>insert into ACCOUNTS values(1,'To ...

  8. Mongodb系列- java客户端简单使用(CRUD)

    Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...

  9. Docker入门 - 001 CentOS Docker 安装

    Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...

  10. Python 获得最近一个月的每天的日期

    直接上代码: #coding:utf-8 # from common.contest import * import datetime import time begin_date = (dateti ...