1

我正在编写一个 python 服务(pyamf),用户可以通过它访问图像。所有图像都存储在中央服务器上。python 服务将在可以通过网络访问服务器的卫星计算机上运行。该服务应按以下方式工作:

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

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

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

谢谢!

4

1 回答 1

1

我猜它要么是线程的,要么是分叉的 apache,但效果是一样的,因为它们正在访问远程资源。

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

我是 Beaker's guts 的原作者,Ben Bangert 将其打包以供 Pylons 使用。

于 2009-12-20T22:06:35.217 回答