<p>要展开我的评论,您可以尝试重命名文件,并通过每个观察者跟踪每个文件类型/名称,如下所示:</p>
<pre><code>watcher 1 -> check for .step0 files
rename to .step1 when finished
watcher 2 -> check for .step1 files
rename to .step2 when finished
...
watcher n -> check for .step{n-1} files
rename to .final_format when finished
</code></pre>
<p>为了演示,下面是一个使用<code>multiprocessing</code>实例化4个不同观察者的示例:</p>
<pre><code>import time, glob
from multiprocessing import Process
path = 'Watcher Demo'
class Watcher(object):
def __init__(self, num):
self.num = num
self.lifetime = 50.0
def start(self):
start = time.time()
targets = '\\'.join((path, f'*.step{self.num-1}'))
while time.time() - start <= self.lifetime:
for filename in glob.glob(targets):
time.sleep(2) # arificial wait so we can see the effects
with open(filename, 'a') as file:
file.write(f"I've been touched inappropriately by watcher {self.num}\n")
newname = glob.os.path.splitext(filename)[0] + f'.step{self.num}'
glob.os.rename(filename, newname)
def create_file():
for i in range(7):
filename = '\\'.join((path, f'job{i}.step0'))
with open(filename, 'w') as file:
file.write(f'new file {i}\n')
time.sleep(5)
if __name__ == '__main__':
if not glob.os.path.exists(path):
glob.os.mkdir(path)
watchers = [Watcher(i).start for i in range(1, 5)]
processes = [Process(target=p) for p in [create_file] + watchers]
for proc in processes:
proc.start()
for proc in processes:
proc.join()
</code></pre>
<p>它将创建和处理如下文件:</p>
<pre><code>create_file() -> *newfile* -> job0.step0
Watcher(1).start() -> job0.step0 -> job0.step1
watcher2('job0.step1') -> job0.step1 -> job0.step2
watcher3('job0.step2') -> job0.step2 -> job0.step3
watcher4('job0.step3') -> job0.step3 -> job0.step4
</code></pre>
<p>文件(如job0.step4)将按以下顺序进行:</p>
<blockquote>
<p>new file 0<br/>
I've been touched inappropriately by watcher 1<br/>
I've been touched inappropriately by watcher 2<br/>
I've been touched inappropriately by watcher 3<br/>
I've been touched inappropriately by watcher 4 </p>
</blockquote>
<p>我没有将文件格式重命名为final格式,因为这只是一个演示,但是很容易实现,因为最终代码应该有不同的观察者,而不是通用的观察者</p>
<p>使用<code>multiprocess</code>模块,您将无法看到每个观察者的独立终端,但这只是为了演示这个概念。。。您可以随时切换到<code>subprocess</code>模块</p>
<hr/>
<p>作为一个补充,我确实注意到性能下降,而我正在测试这个。我想这是因为程序一直在循环和观看。一个更好、更有效的方法是将你的手表作为一项任务安排在特定的时间运行。你可以在点时每小时运行一次watch1,在15分钟时每小时运行一次watch2,在30分钟时每小时运行一次watch3。。。这是一种更有效的方法,因为它只查找一次文件,并且只在找到时处理它们</p>