-
2021-05-10 06:18:52
对于多进程写文件,主要有以下两种处理方式:
1.类似于Linux日志文件服务
启动一个logger进程,其他进程向logger发消息,即把数据发送给logger,由logger来写文件,这种方法最安全,但是实现上相对复杂
2.采用文件锁
对当前读写文件进行加锁处理,简单说下两种加锁方式:
flock():文件级别的锁,针对整个文件进行加锁
fcntl()函数:段级别的锁,能够针对文件的某个部分进行加锁
另外,对于读写相对不很频繁,每次写入数据量比较小的这种情况,不加锁也可以接受,但打开文件操作时,必须启用O_APPEND选项,以免造成多个进程相互覆盖写入的情况。
在O_APPEND模式下,文件写入操作是这样的一个原子操作:将位置指针移动至文件末尾,写入数据。
之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。
linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数:
表头文件 #include
定义函数 int flock(int fd,int operation);
函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
为了更好的移植性,对于文件的打开与关闭我选择了fopen和fclose的组合,但flock的第一个参数要求的是int类型的文件描述符。这里对fopen返回的FILE类型的文件指针进行转换,转换为int型的文件描述符 (假设open函数返回的文件描述符为fd,而fopen返回的文件指针为*fp,则fd等价于fp->_fileno).
下面为两个进程的实例:
#include
#include
#include
#include
int main(void)
{
FILE *fp = NULL;
int i = 20;
if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件
printf("file open error!\n");
if (flock(fp->_fileno, LOCK_EX) != 0) //给该文件加锁
printf("file lock by others\n");
while(1) //进入循环,加锁时间为20秒,打印倒计时
{
printf("%d\n", i--);
sleep(1);
if (i == 0)
break;
}
fclose(fp); //20秒后退出,关闭文件
flock(fp->_fileno, LOCK_UN); //文件解锁
return 0;
}
#include
#include
#include
#include
int main(void)
{
FILE *fp = NULL;
int i = 0;
if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件
printf("file open error!\n");
flock(fp->_fileno, LOCK_EX); //文件加锁
while(1) //进入循环
{
printf("%d\n", i++);
sleep(1);
}
fclose(fp); //关闭文件
flock(fp->_fileno, LOCK_UN); //释放文件锁
return 0;
}
首先运行file1.c,紧接着运行file2.c(运行file1.c后20秒内要运行file2.c否则看不到现象)
现象是:file1.c执行起来以后,开始倒计时。此时运行file2.c会阻塞在加锁处。当file1.c运行20秒后关闭文件,并释放文件锁后,file2.c会开始运行。
更多相关内容 -
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 - ...
-
Python多进程写入同一文件
2016-07-16 10:18:49最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。...既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫GIL的存在,使得Python在同一时间只能运行一个线程,所以只占用了一个CPU,由于我的电脑是4核的,所以CPU利用率就是25%了。
既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受GIL影响的。Python提供了一个multiprocessing的多进程库,但是多进程也有一些问题,比如,如果进程都需要写入同一个文件,那么就会出现多个进程争用资源的问题,如果不解决,那就会使文件的内容顺序杂乱。这就需要涉及到锁了,但是加锁一般会造成程序的执行速度下降,而且如果进程在多处需要向文件输出,也不好把这些代码整个都锁起来,如果都锁起来,那跟单进程还有什么区别。有一个解决办法就是把向文件的输出都整合到一块去,在这一块集中加个锁,这样问题就不大了。不过还有一种更加优雅的解决方式:使用multiprocessing库的回调函数功能。
具体思路跟把文件输出集中在一起也差不多,就是把进程需要写入文件的内容作为返回值返回给惠和的回调函数,使用回调函数向文件中写入内容。这样做在windows下面还有一个好处,在windows环境下,python的多进程没有像linux环境下的多进程一样,linux环境下的multiprocessing库是基于fork函数,父进程fork了一个子进程之后会把自己的资源,比如文件句柄都传递给子进程。但是在windows环境下没有fork函数,所以如果你在父进程里打开了一个文件,在子进程中写入,会出现
ValueError: I/O operation on closed file
这样的错误,而且在windows环境下最好加入if __name__ == '__main__'
这样的判断,以避免一些可能出现的RuntimeError或者死锁。下面是代码:
from multiprocessing import Pool import time def mycallback(x): with open('123.txt', 'a+') as f: f.writelines(str(x)) def sayHi(num): return num if __name__ == '__main__': e1 = time.time() pool = Pool() for i in range(10): pool.apply_async(sayHi, (i,), callback=mycallback) pool.close() pool.join() e2 = time.time() print float(e2 - e1)
运行结果如下:
-
读取/写入同一文件的两个进程Python
2021-07-17 03:15:51I have one process who's reading from a file (using file.read()) and one process who's writing to the same file (file.write()). The problem is it doesn't work - I get no errors but they can't operate ...I have one process who's reading from a file (using file.read()) and one process who's writing to the same file (file.write()). The problem is it doesn't work - I get no errors but they can't operate at the same time. I've tried making the read and write operations none-blocking and then flushing the stream, as follows:
fcntl.fcntl(file, fcntl.F_SETFL, os.O_NONBLOCK)
file.write(msg)
file.flush()
Am I completely misunderstanding it? How should one accomplish writing and reading to one file from different processes?
解决方案
test1.py
import os
f = open('txt.txt', 'a', os.O_NONBLOCK)
while 1:
f.write('asd')
f.flush()
test2.py
import os
f = open('txt.txt', 'r', os.O_NONBLOCK)
while 1:
print f.read(3)
This works fine for me.
-
C#多线程读写同一文件处理
2020-08-06 13:46:53在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”,这是多线程访问统一资源的异常。 具体解决方法有两种: 保证读写操作单线程执行,可以使用lock 使用System.... -
Nginx 多进程并发写同一文件
2020-12-04 16:35:13最近在开发一个自定义的 nginx logger 模块,准备替代 ngx.log,但在开发过程中遇到了一些问题,进而查阅相关资料,最终得出一些有关 “多进程读写同一文件” 的潜在问题与结论。 背景知识 进程与文件句柄 Nginx 为 ... -
python 关于多进程与多线程且写入同一文件情况
2020-11-24 12:07:10目录[-]python 关于多进程与多线程且写入同一文件情况任何语言学习多进程与多线程这都市必要的,最近在学习过程中涉及诸多多进程和多线程的情况,但是多进程之间文件是相互独立的,容易发生资源争抢的问题,造成资源... -
多进程读能否同时写一个文件
2019-12-28 21:44:031.问题 多个进程对同一个文件进行访问会使得写入的数据出现错乱吗,write...在多进程使用write时不会丢掉数据, fwrite会丢掉数据 fwrite速度优于write 3.实验 write版本 #include<stdio.h> #include<sys/ty... -
多个进程对同一文件写入的问题
2016-10-14 10:00:14讨论关于并发环境下,多个进程对同一文件写入的问题,我们会涉及到文件共享的知识。在开始之前,我们先讨论一些有关文件共享的知识。 1. 文件共享 Unix系统支持在不同进程间共享打开的文件。为此,我们先介绍... -
Python学习多进程并发写入同一文件
2017-09-26 22:12:04最近学习了Python的多进程,想到我的高德API爬虫那个爬取读写速度我就心累,实在是慢,看到多进程可以充分利用CPU核数我就开始完善我的代码,不过过程是艰辛的,在此之中出现了很多问题,其中最大的问题是爬取的数据... -
C#下多进程共同读写同一文件
2013-09-30 22:20:00关键是在Changed事件响应函数中,如果以传统只读模式打开文件句柄,老是会提示: 文件正由另一进程使用,因此该进程无法访问该文件。 最后发现构造文件流时除了常见的FileMode外,还可以指定FileS... -
对Python多线程读写文件加锁的实例详解
2020-12-25 04:31:03在管理多个线程对同一文件的读写操作时,就少不了文件锁了。 使用fcntl 在linux下,python的标准库有现成的文件锁,来自于fcntl模块。这个模块提供了unix系统fcntl()和ioctl()的接口。 对于文件锁的操作,主要需要... -
【C/C++业务】多进程同时读写同一个文件
2021-02-04 10:46:58多个进程可同时对同一个文件作共享锁定。 LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。 LOCK_UN 解除文件锁定状态。 LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做... -
python多进程文件操作的一些理解
2020-12-29 10:40:11如果多进程都对同一个文件进行写入,那么就会出现多个进程争夺资源的问题。会使写入的文件内容错乱。1. 写入文件: 同一时间,只能有一个进程,对文件进行写入操作。这是操作系统的设定2. 多进程写入文件: 由操作系统... -
C++ mmap 多进程文件读写
2020-05-04 21:13:02mmap 采用内存映射的方式,直接将磁盘上的文件映射到内存(准确的说是虚拟内存)中,不需要其他额外空间,对内存映射区的修改可以与磁盘文件保持同步,故 mmap 的读写速度非常快 使用 mmap 需注意以下两点:仅支持 ... -
记一次多进程的写入同一个文件的方法
2020-12-04 17:03:30没有学习之前,我的想法是这样的:第一种办法,就是设置一个全局变量write_flag,当一个进程将结果写入时,首先看看write_flag是否为True,如果为True,然后将write_flag重置为Flase,然后将结果写入文件,然后将... -
文件的多进程读写
2013-09-17 16:50:10一直以为多进程读写文件是安全的,只有fflush和fclose才会真正修改文件内容,诸多开源项目的日志系统也基本都是多线程的,asterisk同样没有为ast_log建立一个专门的日志线程,而是各自调用,通过fflush直接写缓存。... -
代码来解决多进程/线程同时读写一个文件的问题。
2017-08-26 21:55:04大家都知道,PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,该文件是被锁定的,其他用户... -
多个进程访问同一文件的解决方法
2016-10-21 22:46:00如果多个用户对一个文件进行操作的时候?如何来解决?考虑用文件锁的形式和多路复用的形式 ①文件锁 使用flock(锁定文件或解除锁定)函数 头文件:#include 函数原型:int flock(int fd,int operation); 函数... -
同一电脑python与C++进程通信——读写txt文件
2020-10-26 17:08:08在同一电脑下,有一个python程序,还有一个C++程序。通过一种比较投机取巧的方法完成进程间通信。就是python和C++读写txt的方式 代码 python端 import os import time def writePose(path, pose): with open(path,... -
多进程侦听同一端口
2016-09-09 13:51:18一、端口侦听 我们知道,系统中的互联网...但是有时候为了实现负载平衡,可能希望有多个进程来侦听同一个套接口,从而并发执行某个任务,此时就希望多个相同的进程(相同的可执行文件)来对同一个套接口进行侦听,从而完 -
多个Java进程可以同时读取同一个文件吗?
2021-03-09 23:22:02是否可以同时从两个或多个不同的进程读取同一个文件?我想在Java应用程序中做这样的事情:final File f = new File("read-only-file");final FileInputStream in = new FileInputStream(f);int b;while((b = in.read... -
Android多个进程同时写同一个文件,会怎么样?
2022-06-19 21:04:29Android多个进程同时写同一个文件,会怎么样? 今人不见古时月,今月曾经照古人 -
C++多线程同时读同一文件
2020-04-06 11:25:32C++多线程同时读同一文件 #include <thread> #include <iostream> #include <fstream> #include <string> #include <sstream> #include <vector> #include <chrono> ...