多进程同时访问文件并发问题解决方法

原创 2012年01月11日 16:20:06

        因为业务需求需要多个进程同时访问某个文件并进行读写操作的需求,因为文件并不是被同一个进程访问,而且极大可能会发生多进程争抢文件句柄的情况,如果在同一个进程里不同的线程访问,或许还能使用线程锁的方式控制,但是跨进程时就无法解决。网上询问解决方法基本上都类似Linux里日志文件服务一样,建立一个独立的文件操作服务,由文件操作服务来控制不同进程对同一个文件的访问。但是这样改动量就比较大,而且因为不同的程序可能是由不同的语言编写的,比如JAVA和C#。而不同的语言访问window服务可能都有局限性(部署更是个大问题因为window服务需要最高的system权限运行),更重要的是如果一个程序需要平凡读写文件,每次读写前必须绕一层服务效率上大打折扣,所以此方法并未采纳。

        为了解决不同开发工具开发和效率所带来的问题,我不得不设计一种较简单实现,又不用太过修改代码的方法。参考vss想到,为什么不能在每次文件读写前先将文件签出?但是如何保证签出后的文件其他进程无法都写呢?一个方法是建立一个签出服务,这个不行原因前面已经提过。于是考虑最简单的方法,也就是每次读写文件前先改文件的扩展名。

        改扩展名的方法非常简单,也不难实现。现在程序访问文件前,都必须用原文件名改名为包含签出扩展名的新文件名(现实中会将文件扩展名改为.ck),其他进程只会访问那些不是.ck为扩展名的文件。

流程:

1)  程序首先得到需要访问的原文件名(比如Test.xml)

2)  使用原文件名作为基础,改名为签出文件名(比如Test.ck)

3)  因为同一时间只可能有一个进程能够修改文件名,所以当一个进程抢先与另一个进程修改了文件,那另一个进程再次使用原文件名(Test.xml)将无法访问到这个文件(因为文件名已经被修改为Test.ck)而报错(可以屏蔽这个错误),如果修改成功则表示文件已经被你签出。你可以继续使用新的文件名对文件进行修改。其他进程如果使用原文件名将无法访问这个文件。

4)  处理完数据后将文件扩展名改回原文件名(Test.xml)

 

        原理和写数据库时抢锁类似,每次访问文件前都必须首先改名(抢锁),只有抢到锁的进程才能进行后续操作。否则则等待其他进程释放锁。


Java文件锁以及并发读写中的应用

引言​ 在项目中,如果遇到需要并发读写文件的问题,那么对文件上锁分开访问是十分有必要的。因此这篇博文主要介绍文件锁的相关知识。有误之处,希望指出。什么是文件锁​ 文件锁就如同编程概念中其他锁的...
  • paditang
  • paditang
  • 2017-06-12 09:37:04
  • 3247

Java高并发读写文件

在实际的项目中我们经常会与遇到操作文件的情况,这是很常见的,但是我们在实际中用传统的I/O操作不能满足我们项目的需要并且对文件的写特别慢,操作比较麻烦。那么我们怎么样实现呢?最近在项目中我们遇到了高并...
  • wsxxm_h
  • wsxxm_h
  • 2016-11-10 16:30:24
  • 5438

高并发文件读写

未来黑科技 2017-12-24 15:53:11 目前着手的项目,是关于一个用文件做缓存的。具体过程是页面的每个请求都会触发一个线程来读取资源文件,当文件系统里不存在该文件时,则会从数据库中读取...
  • u011277123
  • u011277123
  • 2017-12-25 09:31:04
  • 448

java并发读&写文件

java多线程并发处理文件读取.
  • kiksh710000
  • kiksh710000
  • 2016-10-14 16:51:12
  • 803

多进程同时写一个文件会怎样?

一、问题还原在多进程的环境下,父子进程同时去写一个文件,例如父进程每次写入aaaaa,子进程每次写入bbbbb,问题是会不会出现写操作被打断的现象,比如出现aabbbaaabb这样交替的情况?二、结论...
  • yangbodong22011
  • yangbodong22011
  • 2017-03-18 01:46:10
  • 3953

Linux 多进程读写文件 文件锁

目前遇到一个问题:多个进程对同一个文件进行写操作,如何避免冲突。研究了一下,做个小结。   对于多进程写文件,主要有以下两种处理方式: 1.类似于Linux日志文件服务 启动一...
  • abcd1f2
  • abcd1f2
  • 2015-07-07 14:30:33
  • 1108

多进程访问文件的同步

一般面对的都是同一进程中的多线程同步问题,可以用,
  • binling
  • binling
  • 2014-10-27 18:59:53
  • 698

多进程之读写并发问题

// Reader_Writer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using nam...
  • dasgk
  • dasgk
  • 2015-01-15 08:50:38
  • 1271

linux下多进程同时操作文件

我们都知道多进程同时操作文件会出现问题,但是具体会出现什么问题呢?不知道大家有没有仔细研究过,今天我就带大家一起来研究一下。      在操作文件之前,很有必要了解一下内核中文件的存储和访问方式: ...
  • u011508527
  • u011508527
  • 2015-07-14 15:51:19
  • 2604

Python多进程写入同一文件

最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫G...
  • Q_AN1314
  • Q_AN1314
  • 2016-07-16 10:18:49
  • 12788
收藏助手
不良信息举报
您举报文章:多进程同时访问文件并发问题解决方法
举报原因:
原因补充:

(最多只允许输入30个字)