我正在尝试在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
#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函数之前,文件似乎是空的。异步进程的转换使得进程在固定的时间段内被调用。但是从以前的结果来看,它表明时间并不完美,因为两个过程都有不相关的时期。
那为什么呢?