首页 > 编程语言 >Python写文件时加锁,避免写入过程中被读取

Python写文件时加锁,避免写入过程中被读取

时间:2023-06-07 09:46:53浏览次数:40  
标签:fcntl 文件 加锁 读取 Python LOCK json import

问题:

Linux上有个Python2脚本每天定时生成一些数据,并覆盖写入文件A,文件内容是每行一个Json字符串。
有一个乙方的采集器程序(类似filebeat)需要读取文件A,但发现读取的数据有截断,导致解析失败。
怀疑是因为采集器读取文件A的时候,文件A写入还未结束。

解决:

由于采集器程序是乙方自研的,属于黑箱。想着调整下Python脚本,具体方法就是增加排它锁。

在linux下,python的标准库有现成的文件锁,来自于fcntl模块。这个模块提供了unix系统fcntl()和ioctl()的接口。
对于文件锁的操作,主要需要使用 fcntl.flock(fd, operation)这个函数。
其中,参数 fd 表示文件描述符;参数 operation 指定要进行的锁操作,该参数的取值有如下几种:

  • LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有
  • LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有
  • LOCK_UN:表示删除该进程创建的锁
  • LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作
# coding: utf-8
# for python 2.x
from __future__ import unicode_literals
import codecs
import fcntl
import json
import io

# generate json_list
json_list = [{},{},{},{},{}]

with io.open("/path/to/filename", 'w+', encoding="utf8") as f:
    fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加排它锁
    for i in json_list:
        f.write(json.dumps(i, ensure_ascii=False) + "\n")
# 在with块外,文件关闭,自动解锁

 

标签:fcntl,文件,加锁,读取,Python,LOCK,json,import
From: https://www.cnblogs.com/cathonzhd/p/17462476.html

相关文章

  • 【python基础】if语句-处理列表
    通过结合使用if语句和列表,可以完成一些程序上的需求,比如,对列表中特定的值做特殊处理1.测试特殊值比如我们有一个学员名单,其中'刘柏宏'入学比较晚,需要我们重点关注,编写程序如下所示:2.确定列表不是空的到目前为止,对于处理的每个列表都做了一个简单的假设,即假设它们都至少包含一......
  • Python apend & extend 使用说明
    列表操作append()函数a.append(b):是将b原封不动的追加到a的末尾上,会改变a的值,其中,b可为列表、元组、字符串、一串数/字符/字符串append列表a=[1,2,3]b=['a','b']a.append(b)print(a)#[1,2,3,['a','b']]append元组a=[1,2,3]b=('a','b......
  • 【python基础】if语句
    if语句是条件控制语句,在python编程中比不可少,下面是其学习目录:if语句-条件测试if语句-语法格式if语句-处理列表......
  • Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化
    原文链接:http://tecdat.cn/?p=23689最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测 ( 点击文末“阅读原文”获取完整代码数据******** )。在本文中,你将看到如何使用一个被称为长短时......
  • Python信贷风控模型:Adaboost,XGBoost,SGD, SVC,随机森林, KNN预测信贷违约支付|附代码
    图形和统计输出。在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何变化有25个变量:ID: 每个客户的IDLIMIT_BAL: 金额SEX: 性别(1=男,2=女)4.教育程度:(1=研究生,2=本科,3=高中,4=其他,5=未知)5.婚......
  • Python | VSCode的Python编程环境搭建
    1、简介VScode是一款轻量化的代码编辑器,也是目前极为流行的适配性极强的写代码的工具,不仅仅可以用于C/C++代码项目的编写,还能够用于Python、java等其他语言。2、内容a、先下载安装Python的解释器b、安装VSCodec、安装Python相关的插件d、即可运行编译Python代码附:完整教程步骤......
  • 实验6 turtle绘图与python库应用编程体验
    实验任务1task1_.py实验源码:fromturtleimport*defmove(x,y):penup()goto(x,y)pendown()defdraw(n,size=100):foriinrange(n):fd(size)left(360/n)defmain():pensize(2)pencolor('red')move(-20......
  • 【如何入门Python】
    (文章目录)人生苦短,我用Python。欢迎大家一起分享,你是如何入门Python的~方向一:你是如何学习/自学Python的?学习/自学Python的步骤如下:了解Python的基础知识:了解Python的语法、变量、数据类型、算术操作、流程控制语句、函数、模块和包等基础知识。学习Python的核......
  • Python程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......
  • Python爬虫————泉州二手房数据爬取和数据可视化
    1.选题的背景我本次的主题是泉州二手房房价的调查分析。首先通过爬虫采集链家网上所有二手房的房源数据,并对采集到的数据进行清洗;然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的规律;将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面......