我有一个Python HTTP服务器,在某个GET请求中创建了一个文件,该文件随后作为响应返回。文件创建可能需要一秒钟,分别修改(更新)文件。
因此,我不能立即将文件作为响应返回。我该如何处理这样的问题?目前我有这样的解决方案:
while not os.path.isfile('myfile'):
time.sleep(0.1)
return myfile
这看起来非常不方便,但有没有更好的方法呢?
可以使用简单的通知,但我无法控制创建/更新文件的过程。
答案 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
更好的方式来观看文件系统吗?