首页 > 系统相关 >python进程对象操作-互斥锁问题与解决

python进程对象操作-互斥锁问题与解决

时间:2023-03-10 20:45:55浏览次数:44  
标签:__ name python dic 互斥 json 进程 import ticket

多进程下车票购买导致的数据冲突问题

'''
JSON文件 tick_data内容:{"tick_num": 0}
'''

import random import time from multiprocessing import Process import json def search_ticket(name): with open(r'ticket_data', mode='rt', encoding='utf-8') as f: ticket_dic = json.load(f) print(f'用户{name}查询车票剩余{ticket_dic.get("tick_num")}') def buy_ticket(name): with open(r'ticket_data', mode='r', encoding='utf-8') as f: ticket_dic = json.load(f) # 模拟网络延迟 time.sleep(random.randint(1, 3)) if ticket_dic.get("tick_num") > 0: ticket_dic['tick_num'] -= 1 with open(r'ticket_data', mode='w', encoding='utf-8') as f: json.dump(ticket_dic, f) print(f'用户{name}购票成功!') else: print(f'用户{name}购票失败!') def task(name): search_ticket(name) buy_ticket(name) if __name__ == "__main__": for i in range(1, 11): p = Process(target=task, args=(i,)) p.start()

通过Lock() 类加锁解决数据冲突问题


import random
import time
from multiprocessing import Process,Lock
import json


def search_ticket(name): with open(r'ticket_data', mode='rt', encoding='utf-8') as f: ticket_dic = json.load(f) print(f'用户{name}查询车票剩余{ticket_dic.get("tick_num")}') def buy_ticket(name,mutex): with open(r'ticket_data', mode='r', encoding='utf-8') as f: ticket_dic = json.load(f) # 模拟网络延迟 time.sleep(random.randint(1, 3)) if ticket_dic.get("tick_num") > 0: ticket_dic['tick_num'] -= 1 with open(r'ticket_data', mode='w', encoding='utf-8') as f: json.dump(ticket_dic, f) print(f'用户{name}购票成功!') else: print(f'用户{name}购票失败!') def task(name,mutex): search_ticket(name) #查票不需要锁,买票时需要用锁控制顺序保证数据安全 #抢锁 mutex.acquire() buy_ticket(name,mutex) #释放锁 mutex.release() if __name__ == "__main__": mutex = Lock() for i in range(1, 11): p = Process(target=task, args=(i,mutex)) p.start()

 

标签:__,name,python,dic,互斥,json,进程,import,ticket
From: https://www.cnblogs.com/palx/p/17204606.html

相关文章

  • Python 进程对象的一些操作
    1frommultiprocessingimportProcess2importtime34#第一种创建方式,实例化Process类传值5deftask(name):6print('%sisrunning'%name)7......
  • python 基础230310
    变量的命名规则:字母数字下划线/不能以数字开头/不能使用关键字/不能使用中文,要肯有描述性,不能过长驼峰体:AgeOfOld下划线:age_of_old_boy变量指向:变量在......
  • 进程间的6种通信
    进程间为什么需要数据通信?数据传输:一个进程需要将它的数据传送给另外一个进程。资源共享:多个进程之间共享相同的资源。通知事件:一个进程需要向另外一组进程发送消息,通......
  • python实现RabbitMQ六种模式
    为什么管MQ叫做分布式消息中间件?分布式表示应用场景(用户基数大采用分布式提供服务的方式)。消息表示通信形式。中间件表示媒介。生产者和消费者都只是个python程序......
  • 【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
    【希尔排序算法详解】Java/Go/Python/JS/C不同语言实现 说明希尔排序(ShellSort)是插入排序的一种改进版,也称递减增量排序算法(DiminishingIncrementSort),其实质是将数......
  • python+ddt+pymsql实现数据驱动自动化测试
    程序结构:   1,首先连接数据库(mysql.py)并获取到数据库里面的数据importpymysql#创建链接数据库的方法deflianSql(host,user,password,database):""......
  • python pandas DataFrame,Series进一步理解
     更进一步学习和理解DataFrame,Series多个Series拼凑成一个dict,然后将dict转为DataFrame结构#!/usr/bin/evnpythonimportnumpyasnpimportpandasaspd......
  • python_2
    importRPi.GPIOasGPIOimporttimeGPIO.setmode(GPIO.BCM)led=21bt=20GPIO.setup(led,GPIO.OUT)GPIO.setup(bt,GPIO.IN,pull_up_down=GPIO.PUD_UP)ledSt......
  • python
    importRPi.GPIOasGPIOimporttimeGPIO.setmode(GPIO.BCM)led=21bt=20GPIO.setup(led,GPIO.OUT)GPIO.setup(bt,GPIO.IN,pull_up_down=GPIO.PUD_UP)ledStatus=Fals......
  • python根据当前时间创建文件夹
    若想在文件夹名称中包含小时、分钟和秒,可以将时间格式化字符串修改为"%Y-%m-%d-%H-%M-%S"。下面是示例代码:importosfromdatetimeimportdatetime#获取当前时间n......