-
2022-03-14 18:20:09
在 linux 环境下用 Python 进行项目开发过程中经常会遇到多个进程对同一个文件进行读写问题,而此时就要对文件进行加锁控制,在 Python 的 linux 版本下有个 fcntl 模块可以方便的对文件进行加、解锁控制。
import fcntl file_path = "/home/ubuntu/aaa.json" f = open(file_path, 'w') fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加锁,其它进程对文件操作则不能成功 f.write("something") fcntl.flock(f.fileno(), fcntl.LOCK_UN) # 解锁 f.close()
更多相关内容 -
PHP基于文件锁解决多进程同时读写一个文件问题示例
2020-10-19 06:21:48主要介绍了PHP基于文件锁解决多进程同时读写一个文件的方法,结合实例形式分析了PHP使用flock进行文件读写加锁操作用法,需要的朋友可以参考下 -
oracle中utl_file包读写文件操作实例学习
2020-09-10 22:22:24在oracle中utl_file包提供了一些操作文本文件的函数和过程,接下来和大家一起学习他的基本操作,感兴趣的你可以参考下哈希望可以帮助到你 -
对Python多线程读写文件加锁的实例详解
2020-09-19 18:00:57今天小编就为大家分享一篇对Python多线程读写文件加锁的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
ProcessActivityView 1.10中文(监视进程文件读写)
2013-07-22 10:47:44ProcessActivityView 1.10中文(监视进程文件读写) -
linux多进程文件读写.zip
2021-12-05 12:38:21Linux系统的C语言多进程文件读写,包含设计报告,演示视频 -
JAVA文件读写例题实现过程解析
2020-08-18 23:22:17主要介绍了JAVA文件读写例题实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
从内核文件系统看文件读写过程.docx
2020-04-30 00:32:08操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行,处理器设有两种模式:“用户模式”与“内核模式”。... -
详解在.net中读写config文件的各种方法
2021-01-20 07:22:44在config文件中,我将主要演示如何创建自己的自定义的配置节点,而不是介绍如何使用appSetting 。 请明:本文所说的config文件特指app.config或者web.config,而不是一般的XML文件。 在这类配置文件中 -
python多线程同步之文件读写控制
2020-09-18 17:52:20主要为大家详细介绍了python多线程同步之文件读写控制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Android如何读写CSV文件方法示例
2020-08-29 13:51:11CSV 文件是Excel 的标准文件格式,在开发过程中经常需要格式化输出数据。CSV 的格式非常简单,都是一行一行存储的,同一行不同列之间用逗号隔开。下面这篇文章主要给大家介绍了关于Android如何读写CSV文件的相关资料... -
php使用多个进程同时控制文件读写示例
2020-10-26 05:19:16主要介绍了php使用多个进程同时控制文件读写示例,需要的朋友可以参考下 -
asp.net 细说文件读写操作(读写锁)
2020-10-28 06:04:19开发过程中,我们玩玩需要大量与文件交互,读文件,写文件已成家常便饭,本地运行完美,但一上到投产环境,往往会出现很多令人措手不及的意外,或开发中的烦恼,因此,我对普通的C#文件操作做了一次总结 -
Filemon_fix 一个监控程序读写操作文件的工具
2018-12-26 10:17:31Filemon_fix 是一个经典的工具,能够有效的监控每一个进程对于文件的任意操作,包括读写删除创建等…… 感谢Filemon_fix 作者的辛勤编码! -
多进程互斥读写XML文件
2014-11-17 08:19:56多线程进程互斥读写XML文件 -
Java调用明华RF读写器DLL文件过程解析
2020-08-25 05:35:12主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
C++ mmap 多进程文件读写
2020-05-04 21:13:02mmap 采用内存映射的方式,直接将磁盘上的文件映射到内存(准确的说是虚拟内存)中,不需要其他额外空间,对内存映射区的修改可以与磁盘文件保持同步,故 mmap 的读写速度非常快 使用 mmap 需注意以下两点:仅支持 ...mmap 采用内存映射的方式,直接将磁盘上的文件映射到内存(准确的说是虚拟内存)中,不需要其他额外空间,对内存映射区的修改可以与磁盘文件保持同步,故 mmap 的读写速度非常快
使用 mmap 需注意以下两点:
-
仅支持 linux 系统
-
mmap 映射区域大小必须是物理页大小(page size)的整倍数(32 位系统中通常是 4k 字节)
1. mmap 使用
#include <sys/mman.h> #include <fcntl.h> // 开启映射 void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); // 关闭映射 int munmap(void *start, size_t length);
函数形参含义:
-
*start: 指向欲映射的内存起始地址,通常设为 NULL,表示让系统自动选定地址,映射成功后返回该地址
-
length: 表示将文件中多大的部分映射到内存,即映射区的长度
-
prot: 映射区域的保护方式,不能与文件的打开模式冲突。可以为以下一种或几种方式,多种方式使用 or 组合("
|
")PROT_EXEC
: 映射区域可被执行PROT_READ
: 映射区域可被读取PROT_WRITE
: 映射区域可被写入PROT_NONE
: 映射区域不能存取
-
flags: 影响映射区域的各种特性,指定映射对象的类型,映射选项和映射页是否可以共享。在调用 mmap() 时必须要指定 MAP_SHARED 或 MAP_PRIVATE,flags 可以是以下一个或者多个值:
MAP_FIXED
: 如果参数 start 所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励这样设置MAP_SHARED
: 对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到 msync() 或者 munmap() 被调用,文件实际上不会被更新MAP_PRIVATE
: 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容,写入不会影响到原文件。这个标志和 MAP_SHARED 是互斥的,只能使用其中之一MAP_ANONYMOUS
: 建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。MAP_DENYWRITE
: 只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝MAP_LOCKED
: 将映射区域锁定住,这表示该区域不会被置换(swap),从而防止页面被交换出内存MAP_NORESERVE
: 不为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号MAP_LOCKED
: 锁定映射区的页面,从而防止页面被交换出内存MAP_GROWSDOWN
: 用于堆栈,告诉内核 VM 系统,映射区可以向下扩展MAP_POPULATE
: 为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞MAP_NONBLOCK
: 仅和 MAP_POPULATE 一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口
-
fd: 要映射到内存中的文件描述符
-
offset: 文件映射的偏移量,通常设置为 0,表示从文件起始位置对应,offset 必须是 page size 的整数倍
返回值:
- 若映射成功,mmap() 返回映射区的内存起始地址,munmap() 返回 0
- 若映射失败,mmap() 返回 MAP_FAILED,其值为(void *)-1,munmap() 返回 -1
2. mmap 读
int fd = open(file_name.c_str(), O_RDONLY); // 读取文件长度 int len = lseek(fd, 0, SEEK_END); // 建立映射 char *buffer = (char *) mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); // do something // 关闭映射 munmap(buffer, len);
3. mmap 写
int len = data.length(); // 打开文件 int fd = open(file_name.c_str(), O_RDWR | O_CREAT, 00777); // lseek将文件指针往后移动 len - 1 位 lseek(fd, len - 1, SEEK_END); // 预先写入一个空字符;mmap不能扩展文件长度,这里相当于预先给文件长度,准备一个空架子 write(fd, " ", 1); // 建立映射 char *buffer = (char *) mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // 关闭文件 close(fd); // 将 data 复制到 buffer 里 memcpy(buffer, data, len); // 关闭映射 munmap(buffer, len)
4. mmap 多进程写
不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的
这里以 8 进程为例
#include <bits/stdc++.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> using namespace std; const int PROCESS_COUNT = 8; const int RESULT_SIZE = 20000; void work(const string &file_name, int pid) { int fd = open(file_name.c_str(), O_RDWR | O_CREAT, 0666); char *buffer = (char *) mmap(NULL, RESULT_SIZE * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); int start = pid * RESULT_SIZE / PROCESS_COUNT; int end = start + RESULT_SIZE / PROCESS_COUNT; for (int i = start; i < end; ++i) { buffer[i << 1] = (i % 2 != 0 ? '1' : '0'); buffer[i << 1 | 1] = '\n'; } munmap(buffer, RESULT_SIZE * 2); } int main() { string predict_file = "result.txt"; // 填充文件 int fd = open(predict_file.c_str(), O_RDWR | O_CREAT, 0666); lseek(fd, RESULT_SIZE * 2 - 1, SEEK_SET); write(fd, " ", 1); close(fd); // mmap多进程写 int id; pid_t pid; vector<pid_t> pids; for (int i = 1; i < PROCESS_COUNT; i++) { id = i; pid = fork(); if (pid <= 0) break; pids.push_back(pid); } if (pid == -1) { cerr << "startup process failed" << endl; } else { if (pid == 0) { work(predict_file, id); // 子进程 exit(0); } else { work(predict_file, 0); // main进程 } } exit(0); }
5. 注意事项
mmap 映射区域大小必须是物理页大小(page size)的整倍数(32 位系统中通常是 4k 字节)。原因是,内存的最小粒度是页,而进程虚拟地址空间和内存的映射也是以页为单位,为了匹配内存的操作,mmap 从磁盘到虚拟地址空间的映射也必须是页
但是我们要读写的文件大小往往并不是 4k 的整数倍,因此在建立映射时一定要准确把握文件大小与映射区的 length 大小
-
若文件不是 4k 的整数倍,此时实际映射区域依然是 4k 的整数倍,剩余部分用 0 填充。尽管剩余部分不在文件范围内,但是依然可以正常读写,该部分内容的改变并不影响原文件。(比如文件大小为 8000 字节,则实际映射区域大小为 8192 字节,8000 ~ 8192 字节用 0 填充,并且该区域可以正常访问)
-
若设置映射区域大小远大于文件大小,比如文件大小 8000 字节,设置 length 为 100000 字节,则只有与文件相对应的物理页读写有效,即仅有前两页有效,对于 8192 ~ 100000 区域以及 100000 以外的区域,进程不能读写
-
-
HDFS文件读写操作
2018-10-11 21:07:18本文档是关于hadoop中HDFS的文件读写操作的一份ppt,适用于学习hadoop新手. -
python 多进程读写文件
2020-12-08 21:44:50JoinableQueue, cpu_countimport csv####处理一条数据的方法def deal_line(line, writer, csv_file):writer.writerow((line[3], line[1]))csv_file.flush()#重点,在多进程中写文件需要尽快...import time
from multiprocessing import Process, JoinableQueue, cpu_count
import csv
####处理一条数据的方法
def deal_line(line, writer, csv_file):
writer.writerow((line[3], line[1]))
csv_file.flush()#重点,在多进程中写文件需要尽快刷新,否则可能会导致数据丢失
####消费者模型
def consumer(queue, writer, csv_file):
while True:
line = queue.get()
deal_line(line, writer, csv_file)
queue.task_done()
####生产者模型
def producer(queue):
with open('test.txt', 'r') as f:
for line in f:
queue.put(line)
####启动N个生产者N个消费者模型
def main():
with open('t1.csv', 'w+') as csv_file:
writer = csv.writer(csv_file)
queue = JoinableQueue(8)#可限制队列长度
pc = Process(target=producer, args=(queue,))
pc.start()
#多消费者
for _ in range(cpu_count()):
c1 = Process(target=consumer, args=(queue, writer, csv_file))
c1.daemon = True
c1.start()
pc.join()#等待生产者进程全部生成完毕
queue.join()# 等待所有数据全部处理完毕
# 当某些些进程是死循环时可强制终止
# pc.terminate()
if __name__ == '__main__':
now = lambda: time.time()
start = now()
main()
print("Time:", now() - start)
Python 3 读写文件的简单方法!
Python 3 读写文件的简单方法! a = open('test.txt','w') 这行代码创建了一个名为test的文本文档,模式是写入(模式分为三种,w代表写入,r代表阅读,a代表在尾行添加) ...
笨方法学python之读写文件、open函数的用法
一.python读写文件相关知识点 close:关闭文件 read:读取文件的内容//你可以把结果赋给一个变量 readline:只读取文件中的一行 truncate 美 /trʌŋ'ket/ :清空 ...
python查找读写文件
import os ''' 跟据文件名称,后缀查找指定文件 path:传入的路径 filename:要查找的文件名 suffix:要查找的文件后缀 return :返回查找的文件路径 ''' file ...
python之读写文件
1. 读取文件数据,文件必须存在才可以读且如要读取的文件不和当前.py在同一个包下,需要特别指定此文件路径才行 f=open('test.txt',encoding='utf-8')#填写文件路径,打 ...
Python 多进程拷贝文件夹案例
import os import multiprocessing def copy_file(q, file_name, old_folder_name, new_folder_name): &quo ...
【python】 读写文件
#标准输出 sys.stdout.write() sys.stderr.write() #标准输入 while True : try: line = raw_input().rstrip(); exc ...
python 二进制读写文件
#-*- coding: utf-8 -*- f = open('f:/text.bmp','rb') filedata = f.read() filesize = f.tell() f.close( ...
python二进制读写文件
#coding=gbk ''' Created on 2014-5-7 ''' import os.path inputPath = './input.txt' outPath = './out.tx ...
从用python自动生成.h的头文件集合和类声明集合到用python读写文件
最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...
随机推荐
linux下系统编程C环境搭建
一.系统安装 我使用的是VMware8下的ubuntu12.04,这是培训老师说的,12.04相对来说,比较新,而且是5年长期支持版,不容易过时.对于系统的安装,我不想说很多,只是希望大家主义这几点: ...
hivepython 同时读入python 且python脚本中处理外部文件txt
找出表test_gid2中每个gid的安装列表中含有文件pkgs中的pkg名字的数据行. pkgs文件要与python脚本放在一个路径下. 用 transform 的传入数据的时候,不管原文件分隔 ...
VS 2003 无法打开Web项目 文件路径与URL不符 这两者需要映射到相同的服务器位置
解决方法: 将C:\Documents and Settings\Administrator\VSWebCache下面的文件全部删除
.NET c# 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
设置TabBar分栏控制器上图片的大小问题
我们都知道,iOS因为屏幕分辨率的问题,UID在交付我们iOS开发人员程序配图的时候,一般是三套图,分别对应三种不同的分辨率,对不同size的屏幕系统会自动使用不同像素的图片,我们只需要在命名时给三套 ...
201521123032 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
在鼠标右键上加入使用notepad++编辑【转】
我们在安装完notepad++文本编辑器之后,在一个文本文件上右键有时候并没有出现“使用notepad++编辑的选项”,我们可以通过简单地修改注册表文件来增加这样的功能: 1. 首先打开注册表,wi ...
keepalived+mysql主从环境,keepalived返回值是RST,需求解决方法?
环境描述: mysql版本5.6.37 keepalived-1.2.19 系统centos 7:3.10.0-514.26.2.el7 web是:windows server 2 ...
js循环json得到 键和值
var jsondata=[{"男":4,"女":3,"不详":0},{"男one":23,"女two&quo ...
RAC安装重新运行root.sh
rac1执行root.sh成功,rac2执行失败. 在重新执行root.sh前,在rac2上把crs等配置信息删除: # /u01/app//grid/crs/install/rootcrs.pl - ...
-
hadoop 读写文件流程详解
2018-09-19 15:46:26在hadoop中,有三大法宝——HDFS,MapReduce,Hbase,但是无论是MapReduce,Hbase还是hadoop中的其他组件如:Hive等他们要处理的数据还是处理完了的数据都是存储在HDFS中。可见HDFS可以说是hadoop存储的基础和核心,... -
C++读写ini配置文件实现过程详解
2020-08-18 17:21:29主要介绍了C++读写ini配置文件实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
qt中json读写
2018-10-16 22:56:09qt中读写配置json文件,包含读,解析,及创建写入详细过程。 -
C++ builder 的文件读写操作总结.pdf
2020-11-24 10:43:55C++ builder 的文件读写操作总结 在编程的过程中文件的操作是一个经常用到的问题在C++Builder 中可以使用多种 方法对文件操作下面我就按以下几个部分对此作详细介绍就是 1基于C 的文件操作 2基于C++的文件操作 3基于... -
基于Python3读写INI配置文件过程解析
2020-09-16 12:00:00主要介绍了基于Python3读写INI配置文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
操作系统-文件读写过程
2019-10-21 10:09:02硬核详情请查看原文链接,以下是我个人利用书本比喻的理解。 先来看看一本书籍: 假设我们从图书馆中寻找一本“操作系统”的书,我们需要知道的是书名;...我们发现,在具体页中也写着页码,同时存在层级结构:...硬核详情请查看原文链接,以下是我个人利用书本比喻的理解。
先来看看一本书籍:
假设我们从图书馆中寻找一本“操作系统”的书,我们需要知道的是书名;当我们找到这本书后,我们相当于得到了书本的全部内容,即使我们还没开始阅读。
书本会有目录:
从目录中我们知道:这是一本操作系统的书;以及每部分内容对应的页码。
打开某一页(节选):
我们发现,在具体页中也写着页码,同时存在层级结构:进程的通信方式-同步与互斥与P/V信号量操作-进程互斥。假设我们要查找的内容是“进程互斥”,那么需要经过上述的过程才能找到。
接下来说一下虚拟文件系统,在原文链接中提到的作用是用户空间与内核空间的适配。看看虚拟文件系统图:
与前文说到的书本作比较,
超级块:即super_block,类似于整本书;也可以理解为这本书的“书名”,可以通过“书名”从图书馆找到这本书,同时从书的开头开始阅读到整本书的内容。
目录项:类似于书的目录,可以找到目标内容对应的页码。
inode:类似于页码,通过页码可以找到目标内容是在哪一页,这是查找的关键。
打开文件列表:相当于已经打开的一些页或者折起来的一些页。想想我们看书时,有时也同时翻开多页来看,或者把一些页折起来,方便下次直接查看。
address_space:类似于具体的某一页,但这是一个抽象的概念,可以理解为用于承载页面内容的一个空间,相当于书本页在印刷前的一张白纸,但不是这一页的内容。
页缓存基数树:类似于具体的某一页的内容,相当于前文书本例子的层级结构。
file_operations:是对内容的一些操作,例如读read、写write。
【再说两句】
虚拟文件系统中有很多反向或迂回的箭头,这就像我们打开书本某一页,这一页也有页码,可以反推该页在目录中的位置。通过指针使书本结构更加紧密;在利用页码找到对应页时,可能会出现印刷缺漏的情况,这时候又该怎么办呢?
【最后再附上原文链接中读写文件的内容】
读文件
1、进程调用库函数向内核发起读文件请求;
2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
3、调用该文件可用的系统调用函数read()
3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
4、在inode中,通过文件内容偏移量计算出要读取的页;
5、通过inode找到文件对应的address_space;
6、在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
(1)如果页缓存命中,那么直接返回文件内容;
(2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
7、文件内容读取成功。
写文件
前5步和读文件一致,在address_space中查询对应页的页缓存是否存在:
6、如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去。
7、如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步。
8、一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:
(1)手动调用sync()或者fsync()系统调用把脏页写回
(2)pdflush进程会定时把脏页写回到磁盘
同时注意,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。
-
Python读写文件
2021-01-15 00:11:42防止一些无用的文件对象占用内存Python读写文件的五大步骤一、打开文件Python读写文件在计算机语言中被广泛的应用,如果你想了解其应用的程序,以下的文章会给你详细的介绍相关内容,会你在以后的学习的过程中有所... -
易语言hosts文件读写
2020-08-22 04:15:13易语言hosts文件读写源码系统结构:打开,应用,屏蔽,单击,提升进程权限,状态条提示,正则替换,api_GetCurrentProcess,api_OpenProcessToken,api_LookupPrivilegeValue,api_AdjustTokenPrivileges,SetWindowLongA,... -
ProcessActivityView v1.16进程读写文件监控工具.rar
2019-07-13 11:33:00该软件主要用于监视系统进程对哪些文件进行了读写,有利于跟踪分析软件的工作流程。