python:文件同步R / W&多

时间:2018-03-16 15:13:27

标签: python file-io

我正在尝试在python中设计一个程序,它可以随时与服务器共享json文件,所以我测试确定读取和写入文件时是否存在问题。 文件内容的更改与文件内容之间存在差距。

单独的文件

这是我的代码:

#write.py

#from time import sleep

i = 0

while 1:
    f = open("test.txt", 'w')
    f.write(str(i))
    f.close()
    i+=1
#    sleep(1)

#read.py
#import time

f = open("test.txt", 'r')

while 1:
    print "::> ", f.read()
#    time.sleep(1)
    f.seek(0,0)

在单独的终端执行:

bash4.2$ python read.py >> logfile.log

bash4.2$ python write.py

我记录了read.py的输出并得到了这个结果:

::>  1
::>  1
::>  1
::>  1
::>  1
::>  1
::>  1
::>  
::>  
::>  
::>  
::>  2
::>  2
::>  2
::>  2

Here is the image of the log

尝试使用多处理:

#rw.py
import multiprocessing as m


def writing():
    i = 0
    while 1:
        fw = open("test.txt", 'w')
        fw.write(str(i))
        fw.close()
        i+=1

def reading():
    fr = open("test.txt", 'r')
    while 1:
        print "::> ", fr.read()
        fr.seek(0,0)

def main():
    if __name__ == '__main__':
        p_w = m.Process(target=writing, args=())
        p_r = m.Process(target=reading, args=())

        p_w.start()
        p_r.start()

        p_w.join()
        p_r.join()

main()

在终端执行:

bash4.2$ python rw.py >> logfile.log

我记录了这个输出:

::>  0
::>  0
::>  0
::>  0
::>  
::>  1
::>  1
::>  1

This is the picture of result of multiprocessing

可以看出,数字的变化总是存在差距。使用多处理的文件只生成一个行间隙。

为什么会这样?我怎么能避免它? 如果可以避免,该解决方案如何应用于服务器和python程序之间的交互?

感谢。

######## Update 1 ########

我已多次测试该程序,并使用相同的过程尝试使用C和Python。我发现在操作系统和软件阶段,写入和读取并不是非常同步。 (即日志显示不同数字之间的差距不同)

似乎多处理存在优先级问题。有时,日志从一个非常大且不合理的数字开始。

######## Update 2 ########

我成功地在多处理中调用优先级来获得文件I / O同步。

from multiprocessing import *

def writer(queue):
        i = 0
        while 1:
                f = open("test.txt", 'w')
                f.write(str(i))
                queue.put("ready")
                i+=1
                f.close()
                queue.put("end")

def reader(queue):
        f = open("test.txt",'r')
        for temp in iter(queue.get, "ready"):
                pass
        while 1:
                for judge in iter(queue.get, "end"):
                        f.seek(0,0)
                        print f.read()

def main():
        if __name__ == '__main__':
                queue = Queue()

                reader_p = Process(target=reader, args=(queue,))
                reader_p.daemon = True
                reader_p.start()

                writer_p = Process(target=writer, args=(queue,))
                writer_p.daemon = True
                writer_p.start()

                reader_p.join()
                writer_p.join()
main()

但是,这从日志文件中的1开始。 在调用write函数之前,文件似乎是空的。异步进程的转换使得进程在固定的时间段内被调用。但是从以前的结果来看,它表明时间并不完美,因为两个过程都有不相关的时期。

那为什么呢?

0 个答案:

没有答案