使用两个应用实例控制对资源的访问

0 投票
3 回答
509 浏览
提问于 2025-04-18 16:11

我有一个需求,就是要统计我的应用程序中哪个功能使用得最多。我把所有的统计数据都存储在一个文件里。每次应用程序关闭时,它会把统计数据写入这个文件。

这个应用程序是独立运行的,放在服务器上,多个用户可以同时使用这个应用程序(就像在不同地方同时运行多个副本一样)。

问题是,如果多个用户同时尝试更新统计数据,就可能会出现错误的统计结果(这就是所谓的并发控制问题)。那么,我该如何在Python中处理这种情况呢?

我在统计文件中存储以下数据:

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

3 个回答

0

你的问题看起来像是读者-写者问题的一种变体,这种问题是针对数据库事务的。我会创建一个SQL事务类,主要负责和数据库进行增删改查操作。然后我会设置一个标志,这个标志可以像互斥锁一样被锁定和释放,这样你就能确保不会有两个同时进行的操作在同一时间内进入关键区域(也就是同时进行数据库的更新或插入)。

我还认为有一种读者-写者锁,专门用来控制对共享资源的访问,这可能对你有帮助。

如果你有任何问题,请告诉我!

0

在你的代码中,如果有一个共享资源可以被多个应用程序使用,就要使用锁。

import threading
mylock = threading.Lock()

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

你可以使用portalocker这个模块,它是一个很棒的工具,可以让你方便地使用文件系统锁。

如果你只在一个平台上工作,可以使用该平台特有的文件锁功能,通常这些功能可以在Python的标准库中找到。

你也可以使用一个合适的数据库,但对于你现在的任务来说,这样做似乎有点过于复杂了。

编辑:看到你打算使用线程锁,建议你不要这样做!线程锁(比如互斥锁或信号量)只是在同一个进程中的多个线程之间防止它们同时访问共享变量,它们无法在不同的进程之间工作,尤其是独立的程序实例之间!你需要的是文件锁机制,而不是线程锁。

撰写回答