1

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

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

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

这似乎很不方便,但有没有更好的方法?

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

4

4 回答 4

0

像这样的东西会删除os呼叫:

while updating:
    time.sleep(0.1)
return myfile

...

def updateFile():
    # updating file

    updating = false
于 2013-01-04T06:40:01.063 回答
0

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

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

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

于 2013-01-04T06:57:27.547 回答
0

您可以尝试使用os.path.getmtime,这将检查文件的修改时间,如果小于 1 秒则返回。另外我建议您只进行有限的尝试,否则如果文件没有被创建/修改,您将陷入无限循环。正如@Krzysztof Rosiń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)
于 2013-01-04T06:58:38.903 回答
0

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

于 2013-01-04T07:31:21.720 回答