2009-12-20 43 views
1

我正在写一个用户可以访问图像的python服务(pyamf)。所有图像都存储在中央服务器上。 python服务将在有网络访问服务器的卫星机器上运行。该服务应该如下工作:Python服务文件缓存Apache竞争条件

  1. 本地检查以查看文件是否存在,如果存在,请使用它。
  2. 本地检查是否正在从服务器传输文件(file.part存在且大小正在更改)。如果是这样,等待下载完成,然后使用文件。
  3. 如果文件不存在且文件未被下载,请通过urlretrieve下载文件。

问题在于Apache的多线程。线程同时到达文件存在检查,因此他们都认为文件需要下载。不用说,这不好。

什么是正确的方式来处理这种竞争条件?

谢谢!

回答

1

我猜它是一个线程或分叉的Apache,但效果将是相同的,因为他们正在访问远程资源。

这个问题有时被称为“狗堆”问题,它的烧杯缓存库(http://beaker.groovie.org)解决的问题之一。它提供了一个系统,通过该系统可以创建一个可调用的“创建”一个新的缓存值,在这种情况下,如果某个值尚不存在,则该URL将对应于所提取的某个图像。使用锁定是为了使并发线程或进程等待被选为“创建者”的单个进程完成其操作。烧杯将使用锁定文件(如果在类似unix的多进程系统上配置)或者在Windows系统上使用互斥锁(mutex)。

我是烧杯的胆量和本Bangert的原始作者,他把它包装起来用于Pylons。