2013-01-15 41 views
0

我已中Bottle.pyBottle.py具有短延迟结果,以零长度响应

@get('/create/new/image', apply=[auth_request]) 
def request_new_image(): 
    file = invoke_image_creation() 
    return static_file(file, root='pics', 
         mimetype='image/jpg') 

定义下列静态路由在该方法中,供应较大的图像invoke_image_creation()一个简单的事件锁(threading.Event)用于让应用程序阻塞,直到图像被创建。然后它应该返回静态文件。

对于小型图像工作的,对于较大的(1280×720与约50 KB),它返回:

  • HTTP 200
  • 响应没有内容
  • 内容长度:0
  • MIME-类型:image/jpg

阻塞只持续一会儿,远远小于一秒钟,只是为了确保它在那里。

这可能是什么原因造成的?使用simple routing static files function工作得很好,图片完全一样。唯一的区别是,该文件事先存在并在HTTP GET请求中定义。

+0

你是否正确关闭文件? –

+0

@MartijnPieters其实这不是我的呼吁,因为图像创建是由一个单独的过程完成的,我所做的只是观察文件系统的变化(inotify,创建文件事件),然后解锁'threading.Event'。因此,文件关闭由另一个进程完成。但是,文件创建事件和文件结束流之间可能存在一些重叠? –

+0

将文件写入磁盘会有滞后吗? –

回答

1

将文件打开和文件数据刷新到磁盘之间存在延迟,因此如果您正在监视文件创建事件,则可以轻松地返回基本上仍是空文件的文件。

您需要更改通知以侦听更改而不是新文件,或者确保新文件完全形成。

要做后者,请更改外部进程以在不同位置创建文件,然后在创建图像时将文件移动到您正在观看的位置。如果两个位置在同一个分区上,则移动将是原子的;如果您的文件监控发现该文件出现,则可以保证该文件在该时刻不会为空。

或者伪蟒蛇代码,在独立的进程:

import shutil 

createImage(locA, filename) 
shutil.move(os.path.join(locA, filename), locB) 

,观locB

+0

问题是我无法修改我用于图像创建的过程的代码。到目前为止,我已经使用文件创建事件来触发事件。这个创建文件事件之后是一个文件修改事件,我相信我从inotify获得这个事件,什么时候写入文件。 –

+0

@MaxRhan:你不能添加包装过程?使用'subprocess.call()'的小脚本,然后做这个举动?地狱,甚至是一个bash脚本? –

+0

我不认为这是一种选择,因为这个过程不仅仅是创建图像,它不是一个命令行工具。但是,有帮助的是重写'on_modified'方法而不是'on_created'方法,因为前一个只在文件流再次关闭后才被调用。首先这就是我想要的。随意添加到您的答案,我欣然接受。两者都是可行的解决方案。 –