控制对具有两个应用程序实例的资源的访问

时间:2014-08-06 05:37:46

标签: python concurrency semaphore

我有一个用例,我必须计算我的应用程序的用途,哪个功能最常用。我将所有统计信息存储在一个文件中。每次应用程序关闭时,它都会将统计信息写入该文件。

应用程序是独立的并且位于服务器中,并且多个人可以通过运行应用程序同时使用该应用程序(因此它就像多个应用程序副本将在不同的地方运行一样)。

所以问题是如果有多个人同时尝试更新统计数据,则有可能获得错误的统计信息(并发控制问题)。那么如何在python中处理这种情况呢?

我将后续数据存储在我的stat文件::

stats  = {user1 : {feature1 : count, feature2 : count, etc..},
          user2 : {feature1 : count, feature2 : count, etc..}
}

3 个答案:

答案 0 :(得分:1)

您可以使用portalocker,它是一个很棒的模块,可以让您以可移植的方式使用文件系统锁。

如果您只局限于一个平台,则可以使用特定于平台的文件锁定原语,通常通过python标准库公开。

你也可以使用一个合适的数据库,但这对于手头的任务似乎是一个巨大的过度杀伤。

编辑:看到您即将使用线程锁,不要!线程锁(互斥锁或信号量)只能防止同一进程中的多个线程访问共享变量,它们跨单独的进程工作,尤其是独立的程序实例!你需要的是一个文件锁定机制,而不是线程锁。

答案 1 :(得分:0)

您的问题似乎是读者编写者问题的一种风格,它扩展到数据库中的事务。我将创建一个SQL事务类,它主要负责与您的数据库的CRUD操作。然后我会有一个可以锁定的标志,并以与互斥锁非常相似的方式释放,这样你就可以确保没有两个并发进程在它们的关键部分(执行UPDATE或INSERT进入数据库)同一时间。

我也相信有一个读者 - 作家锁定,专门用于控制对您可能感兴趣的共享资源的访问。

如果您有任何疑问,请与我们联系!

答案 2 :(得分:0)

在您的代码中,多个应用程序可以使用共享资源,请使用锁定

import threading
mylock = threading.Lock()

with mylock:
     ....
     #access the shared resource