Python服务文件缓存Apache竞争条件

Python服务文件缓存Apache竞争条件,python,apache,service,race-condition,Python,Apache,Service,Race Condition,我正在编写一个python服务(pyamf),用户可以通过它访问图像。所有图像都存储在中央服务器上。python服务将在可以通过网络访问服务器的卫星计算机上运行。该服务应按以下方式工作: 本地检查文件是否存在,如果存在,请使用它 本地检查文件当前是否正在从服务器传输(file.part存在且大小正在更改)。如果是这样,请等待下载完成,然后使用文件 如果文件不存在且未下载文件,请通过urlretrieve下载该文件 问题在于Apache的多线程。线程同时到达文件存在性检查,因此它们都认为需要下载文

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

  • 本地检查文件是否存在,如果存在,请使用它
  • 本地检查文件当前是否正在从服务器传输(file.part存在且大小正在更改)。如果是这样,请等待下载完成,然后使用文件
  • 如果文件不存在且未下载文件,请通过urlretrieve下载该文件
  • 问题在于Apache的多线程。线程同时到达文件存在性检查,因此它们都认为需要下载文件。不用说,这是不好的

    处理这种比赛情况的正确方法是什么


    谢谢

    我猜它可能是一个线程化的apache,也可能是一个分叉的apache,但是效果是一样的,因为它们正在访问远程资源

    这个问题有时被称为“狗堆”问题,它是烧杯缓存库()解决的问题之一。它提供了一个系统,通过该系统,您可以创建一个可调用的对象,该对象“创建”一个新的缓存值,在本例中,如果某个值不存在,则创建一个对应于所获取的某个图像的URL。锁定的使用使得并发线程或进程等待被选为“创建者”的单个进程完成其工作。如果在类似unix的多进程系统上配置,Bicker将使用lockfiles;如果在windows系统上配置,则使用互斥锁


    我和本·班格特是《烧杯的内脏》的原作者,他们把它包装起来用于塔架

    我猜它可能是一个线程化的apache,也可能是一个分叉的apache,但是效果是一样的,因为它们正在访问远程资源

    这个问题有时被称为“狗堆”问题,它是烧杯缓存库()解决的问题之一。它提供了一个系统,通过该系统,您可以创建一个可调用的对象,该对象“创建”一个新的缓存值,在本例中,如果某个值不存在,则创建一个对应于所获取的某个图像的URL。锁定的使用使得并发线程或进程等待被选为“创建者”的单个进程完成其工作。如果在类似unix的多进程系统上配置,Bicker将使用lockfiles;如果在windows系统上配置,则使用互斥锁

    我和本·班格特是《烧杯的内脏》的原作者,他们把它包装起来用于塔架