我有一个 Python HTTP 服务器,在某个 GET 请求上创建了一个文件,该文件随后作为响应返回。文件创建可能需要一秒钟,分别是文件的修改(更新)。
因此,我无法立即将文件作为响应返回。我该如何处理这样的问题?目前我有这样的解决方案:
while not os.path.isfile('myfile'):
time.sleep(0.1)
return myfile
这似乎很不方便,但有没有更好的方法?
一个简单的通知就可以了,但我无法控制创建/更新文件的过程。
我有一个 Python HTTP 服务器,在某个 GET 请求上创建了一个文件,该文件随后作为响应返回。文件创建可能需要一秒钟,分别是文件的修改(更新)。
因此,我无法立即将文件作为响应返回。我该如何处理这样的问题?目前我有这样的解决方案:
while not os.path.isfile('myfile'):
time.sleep(0.1)
return myfile
这似乎很不方便,但有没有更好的方法?
一个简单的通知就可以了,但我无法控制创建/更新文件的过程。
像这样的东西会删除os呼叫:
while updating:
time.sleep(0.1)
return myfile
...
def updateFile():
# updating file
updating = false
在同步 HTTP 请求中实现阻塞 io 操作是一种不好的方法。如果许多人同时运行相同的过程,您可能很快就会用完线程(如果线程池有限)。我会做以下事情:
客户端请求文件创建 URI。文件生成过程在后台进程(一些异步任务系统)中初始化,用户在 HTTP 响应中获取文件 ID/名称。接下来,客户端每隔一段时间(轮询)进行一次 AJAX 调用,以检查文件是否已创建/修改(单独的文件服务/检查是否存在 URI)。最终创建文件后,用户将被重定向(js window.location)到文件服务 URI。
这种方法需要更多的工作,但最终会得到回报。
您可以尝试使用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)
您可以使用Watchdog更好的方式来查看文件系统吗?