2017-06-01 63 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嘗試打開它嗎?

相關問題