【问题标题】:Shared lock for Python objectsPython 对象的共享锁
【发布时间】:2014-03-20 03:19:16
【问题描述】:

我正在 Heroku 上使用 Flask/Gunicorn 开发一个小型 Web 应用程序。由于我只是在进行原型设计,因此我有一个 Web 进程 (dyno),其中一个工作线程由同一进程启动。 Web 应用程序只是返回一个全局对象的 JSON 转储,它由监视外部 Web 服务的工作线程定期更新。全局对象每 15 到 60 分钟更新一次。我的计划是在需要更新全局对象时在工作线程中使用排他锁,并在 Web 线程中使用共享锁,以便可以同时满足多个请求。不幸的是,Python 似乎没有共享锁,只有排他锁。如何确保 Web 线程的一致性,即如何确保对全局对象的更新是原子的,同时允许对对象进行多次只读访问?

【问题讨论】:

标签: python multithreading locking


【解决方案1】:

由于更新很少,最好只制作对象的副本,更新副本,然后更新全局变量以指向新对象。 python中的简单赋值是原子的,所以你根本不需要任何锁。

【讨论】:

  • 我想过,但是由于对象有很多属性,所以仍然有可能在一个 web 线程正在读取它们时发生更新,因此 web 线程获取了旧对象的部分属性并更新对象的部分属性。
  • 我所描述的方案不会发生这种情况。你有一个全局变量。您永远不会更新全局变量指向的对象。您复制全局变量指向的对象。此副本必须复制您打算更新的任何内容。 copy.deepcopy 会很安全。然后更新私有副本,最后通过交换变量将新副本发布为全局共享事物。读者将全局变量复制到一个临时的。临时指向的对象永远不会被触及。这基本上是 RCU。
  • 现在有意义吗?如果是这样,我会更新原来的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2014-10-22
相关资源
最近更新 更多