阻止执行,直到创建/修改文件

时间:2013-01-04 06:23:06

标签: python file-io concurrency

我有一个Python HTTP服务器,在某个GET请求中创建了一个文件,该文件随后作为响应返回。文件创建可能需要一秒钟,分别修改(更新)文件。

因此,我不能立即将文件作为响应返回。我该如何处理这样的问题?目前我有这样的解决方案:

 while not os.path.isfile('myfile'):
      time.sleep(0.1)
 return myfile

这看起来非常不方便,但有没有更好的方法呢?

可以使用简单的通知,但我无法控制创建/更新文件的过程。

4 个答案:

答案 0 :(得分:0)

这样的内容会删除os来电:

while updating:
    time.sleep(0.1)
return myfile

...

def updateFile():
    # updating file

    updating = false

答案 1 :(得分:0)

在同步HTTP请求中实现阻止io操作是一种糟糕的方法。如果许多人同时运行相同的过程,您可能很快就会用完线程(如果有一个有限的线程池)。我会做以下事情:

客户端请求文件创建URI。文件生成过程在后台进程(某个异步任务系统)中初始化,用户在HTTP响应中获取文件ID /名称。接下来,客户端每隔一段时间进行一次AJAX调用(轮询),以检查文件是否已被创建/修改(单独的文件服务/ check-if-exists URI)。最后创建文件时,会将用户重定向(js window.location)到文件服务URI。

这种方法需要更多的工作,但最终会得到回报。

答案 2 :(得分:0)

您可以尝试使用os.path.getmtime,这会检查文件的修改时间,如果不到1秒前则返回。此外,我建议你只进行有限的尝试,否则如果文件没有被创建/修改,你将陷入无限循环。正如@KrzysztofRosiński所指出的那样,你应该考虑以非阻塞方式进行。

import os
from datetime import datetime
import time

for i in range(10):
    try:
        dif = datetime.now()-datetime.fromtimestamp(os.path.getmtime(file_path))
        if dif.total_seconds() < 1:
            return file            
    except OSError:            
        time.sleep(0.1)

答案 3 :(得分:0)

您可以使用Watchdog更好的方式来观看文件系统吗?