2017-06-01 61 views
1

我有一个python程序(比如reader.py),使用文件setting.py从阅读:如何不能写入文件,而阅读,反之亦然

while(True): 
    ... 
    execfile(settings.py) 
    ... 

但有其他python程序(比如writer.py),其使用此文件写入到:

... 
try: 
    settings = open('settings.py', 'w') 
    settings.truncate() 
    settings.write('some text') 
except IOError: 
    print('Cannot write to file') 
finally: 
    settings.close() 
... 

注1:reader.pywriter.py不'知道'对每个行吟诗人河

注2:reader.py读取settings.py循环,虽然writer.py写道,当用户想要的文件到(在他/她点击了“”写'不一定正确的,它只是意味着没有任何规则时向右) 。

问题:什么是,以避免任何矛盾,以合作两种方案的最佳方式?我知道这可能取决于平台。我正在使用Linux。发行版本是:Ubuntu,Scientific Linux。

EDIT1:如果我选择使用FiFo我会遇到以下问题:一旦作家写settings文件时,它可能永远不会再写信,但读者应该在这种情况下,必须settings访问反正。换句话说,读者应该有能力从文件中读取,而不是在这种情况下等待作者。否则读者必须等待作家。 如果写入者没有写入(直到写入),则普通使用FiFo不允许读者从文件读取。如何处理这个问题?

+1

如果您需要并行运行这两个脚本,同时确保读/写不同时发生,您可以尝试使用[multiprocessing](https://docs.python.org/3/library/multiprocessing)。 html),创建分离的线程并加入它们。 –

+0

您可能想要写入'settings_new.py',然后一旦写入完成,将'settings_new.py'移至'settings.py'(覆盖它)。我认为这应该创建一个原子“更新”文件 - 许多应用程序,如文本编辑采取这种方法。 – Attie

回答

1


       你可能有兴趣在使用命名管道为你的进程间通信。在Linux中可用,它是为客户端(writer.py),服务器(reader.py),任务设计的一种特殊类型的文件。写入管道后,客户端将等待服务器收到数据。这允许你在一定程度上同步这两个进程。

Linux Manual for FiFo
Python doc: os.mkfifo(path[, mode])

+0

你的建议很有帮助,但我不知道该怎么做:当* reader *打开FIFO时,我想*写作者*等待。反之亦然。但是如果* writer *当前不写入FIFO * reader * **不应该等到* writer *准备就绪。 – BogdanSikach

0

我发现下面的解决方案,它似乎是工作。我使用flock来创建锁。

Reader

import errno                      
import fcntl 
from time import * 

path = "testLock.py" 

f = open(path, "r") 

while True: 
    try: 
    fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB) 
    break 
    except IOError as e: 
    if e.errno != errno.EAGAIN: 
    raise 
    else: 
    sleep(1) 
    print 'Waiting...' 

#reader's action  
execfile(path) 
#drop lock   
fcntl.flock(f, fcntl.LOCK_UN) 

Writer

import errno                      
import fcntl 
from time import * 

path = "testLock.py" 

f = open(path, "w") 

while True: 
    try: 
    fcntl.flock(f, fcntl.LOCK_SH | fcntl.LOCK_NB) 
    break 
    except IOError as e: 
    if e.errno != errno.EAGAIN: 
    raise 
    else: 
    sleep(1) 
    print 'Waiting...' 

#writer's action  
for i in (1,10,2): 
    f.write('print "%d" % i') 
    sleep(1) 
#drop lock   
fcntl.flock(f, fcntl.LOCK_UN) 

我这里有一些问题:

Qusetion 1:是的LOCK_EXLOCK_SH正确使用我的意思是,他们在正确的地方?

问题2:读者的行为是否为i。e execfile正确吗?如果该文件已经打开是execfile尝试打开它吗?

相关问题